/// <summary> /// Updates the object with the results of a modify monitored item request. /// </summary> internal void SetModifyResult( MonitoredItemModifyRequest request, MonitoredItemModifyResult result, ServiceResult error) { if (request == null) { throw new ArgumentNullException(nameof(request)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } m_error = error; if (ServiceResult.IsGood(error)) { m_clientHandle = request.RequestedParameters.ClientHandle; m_samplingInterval = request.RequestedParameters.SamplingInterval; m_queueSize = request.RequestedParameters.QueueSize; m_discardOldest = request.RequestedParameters.DiscardOldest; m_filter = null; if (request.RequestedParameters.Filter != null) { m_filter = Utils.Clone(request.RequestedParameters.Filter.Body) as MonitoringFilter; } m_samplingInterval = result.RevisedSamplingInterval; m_queueSize = result.RevisedQueueSize; } }
/// <summary> /// Updates the object with the results of a modify monitored item request. /// </summary> public void SetModifyResult( MonitoredItemModifyRequest request, MonitoredItemModifyResult result, int index, DiagnosticInfoCollection diagnosticInfos, ResponseHeader responseHeader) { ServiceResult error = null; if (StatusCode.IsBad(result.StatusCode)) { error = ClientBase.GetResult(result.StatusCode, index, diagnosticInfos, responseHeader); } m_status.SetModifyResult(request, result, error); m_attributesModified = false; }
/// <summary> /// Returns the results for the modify request. /// </summary> public ServiceResult GetModifyResult(out MonitoredItemModifyResult result) { lock (_lock) { result = new MonitoredItemModifyResult { StatusCode = StatusCodes.Good, RevisedSamplingInterval = _samplingInterval, RevisedQueueSize = 0, FilterResult = null }; if (_queue != null) { result.RevisedQueueSize = _queue.QueueSize; } return(ServiceResult.Good); } }
/// <summary> /// Returns the results for the modify request. /// </summary> public ServiceResult GetModifyResult(out MonitoredItemModifyResult result) { lock (m_lock) { result = new MonitoredItemModifyResult(); result.StatusCode = StatusCodes.Good; result.RevisedSamplingInterval = m_samplingInterval; result.RevisedQueueSize = 0; result.FilterResult = null; if (m_queue != null) { result.RevisedQueueSize = m_queue.QueueSize; } return(ServiceResult.Good); } }
/// <summary> /// Returns the result after modifying the monitor item. /// </summary> public ServiceResult GetModifyResult(out MonitoredItemModifyResult result) { lock (m_lock) { result = new MonitoredItemModifyResult(); result.RevisedSamplingInterval = m_samplingInterval; result.RevisedQueueSize = m_queueSize; result.StatusCode = StatusCodes.Good; if (ServiceResult.IsBad(m_samplingError)) { result.StatusCode = m_samplingError.Code; } return m_samplingError; } }
/// <summary> /// Modifies monitored items in a subscription. /// </summary> public void ModifyMonitoredItems( OperationContext context, TimestampsToReturn timestampsToReturn, MonitoredItemModifyRequestCollection itemsToModify, out MonitoredItemModifyResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { if (context == null) throw new ArgumentNullException("context"); if (itemsToModify == null) throw new ArgumentNullException("itemsToModify"); int count = itemsToModify.Count; // allocate results. bool diagnosticsExist = false; results = new MonitoredItemModifyResultCollection(count); diagnosticInfos = null; if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { diagnosticInfos = new DiagnosticInfoCollection(count); } // build list of items to modify. List<IMonitoredItem> monitoredItems = new List<IMonitoredItem>(count); List<ServiceResult> errors = new List<ServiceResult>(count); List<MonitoringFilterResult> filterResults = new List<MonitoringFilterResult>(count); double[] originalSamplingIntervals = new double[count]; bool validItems = false; lock (m_lock) { // check session. VerifySession(context); // clear lifetime counter. ResetLifetimeCount(); for (int ii = 0; ii < count; ii++) { filterResults.Add(null); LinkedListNode<IMonitoredItem> node = null; if (!m_monitoredItems.TryGetValue(itemsToModify[ii].MonitoredItemId, out node)) { monitoredItems.Add(null); errors.Add(StatusCodes.BadMonitoredItemIdInvalid); // update diagnostics. if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { DiagnosticInfo diagnosticInfo = ServerUtils.CreateDiagnosticInfo(m_server, context, errors[ii]); diagnosticsExist = true; diagnosticInfos.Add(diagnosticInfo); } continue; } IMonitoredItem monitoredItem = node.Value; monitoredItems.Add(monitoredItem); originalSamplingIntervals[ii] = monitoredItem.SamplingInterval; errors.Add(null); validItems = true; // update diagnostics. if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { diagnosticInfos.Add(null); } } } // update items. if (validItems) { m_server.NodeManager.ModifyMonitoredItems( context, timestampsToReturn, monitoredItems, itemsToModify, errors, filterResults); } lock (m_lock) { // create results. for (int ii = 0; ii < errors.Count; ii++) { ServiceResult error = errors[ii]; MonitoredItemModifyResult result = null; if (ServiceResult.IsGood(error)) { error = monitoredItems[ii].GetModifyResult(out result); } if (result == null) { result = new MonitoredItemModifyResult(); } if (error == null) { result.StatusCode = StatusCodes.Good; } else { result.StatusCode = error.StatusCode; } // update diagnostics. if (ServiceResult.IsGood(error)) { ModifyItemSamplingInterval(originalSamplingIntervals[ii], result.RevisedSamplingInterval, monitoredItems[ii].MonitoringMode); } if (filterResults[ii] != null) { result.FilterResult = new ExtensionObject(filterResults[ii]); } results.Add(result); if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { if (error != null && error.Code != StatusCodes.Good) { diagnosticInfos[ii] = ServerUtils.CreateDiagnosticInfo(m_server, context, error); diagnosticsExist = true; } } } // clear diagnostics if not required. if (!diagnosticsExist && diagnosticInfos != null) { diagnosticInfos.Clear(); } // TraceState("ITEMS MODIFIED"); } }
/// <summary> /// Updates the object with the results of a modify monitored item request. /// </summary> internal void SetModifyResult( MonitoredItemModifyRequest request, MonitoredItemModifyResult result, ServiceResult error) { if (request == null) throw new ArgumentNullException("request"); if (result == null) throw new ArgumentNullException("result"); m_error = error; if (ServiceResult.IsGood(error)) { m_clientHandle = request.RequestedParameters.ClientHandle; m_samplingInterval = request.RequestedParameters.SamplingInterval; m_queueSize = request.RequestedParameters.QueueSize; m_discardOldest = request.RequestedParameters.DiscardOldest; m_filter = null; if (request.RequestedParameters.Filter != null) { m_filter = Utils.Clone(request.RequestedParameters.Filter.Body) as MonitoringFilter; } m_samplingInterval = result.RevisedSamplingInterval; m_queueSize = result.RevisedQueueSize; } }
/// <summary> /// Returns the results for the modify request. /// </summary> public ServiceResult GetModifyResult(out MonitoredItemModifyResult result) { lock (m_lock) { result = new MonitoredItemModifyResult(); result.StatusCode = StatusCodes.Good; result.RevisedSamplingInterval = m_samplingInterval; result.RevisedQueueSize = 0; result.FilterResult = null; if (m_queue != null) { result.RevisedQueueSize = m_queue.QueueSize; } return ServiceResult.Good; } }