1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
// OPCUA for Rust // SPDX-License-Identifier: MPL-2.0 // Copyright (C) 2017-2020 Adam Lock //! Callbacks that a server implementation may register with the library use std::sync::{Arc, RwLock}; use opcua_types::{ AttributeId, DataValue, NodeId, NumericRange, QualifiedName, service_types::{CallMethodRequest, CallMethodResult, TimestampsToReturn}, status_code::StatusCode, }; use crate::session::Session; /// An attribute getter trait is used to obtain the data value associated with the particular attribute id /// This allows server implementations to supply a value on demand, usually in response to a polling action /// such as a monitored item in a subscription. /// /// `node_id` is the node to which the node belongs /// `attribute_id` is the attribute of the node to fetch a value for /// /// Use `max_age` according to the OPC UA Part 4, Table 52 specification to determine how to return /// a value: /// /// * 0 = a new value /// * time in ms for a value less than the specified age /// * i32::max() or higher to fetch a cached value. /// pub trait AttributeGetter { /// Returns a data value of the specified attribute or none. fn get(&mut self, node_id: &NodeId, timestamps_to_return: TimestampsToReturn, attribute_id: AttributeId, index_range: NumericRange, data_encoding: &QualifiedName, max_age: f64) -> Result<Option<DataValue>, StatusCode>; } // An attribute setter. Sets the value on the specified attribute pub trait AttributeSetter { /// Sets the attribute on the specified node fn set(&mut self, node_id: &NodeId, attribute_id: AttributeId, index_range: NumericRange, data_value: DataValue) -> Result<(), StatusCode>; } /// Called by RegisterNodes service pub trait RegisterNodes { /// Called when a client calls the RegisterNodes service. This implementation should return a list /// of the same size and order containing node ids corresponding to the input, or aliases. The implementation /// should return `BadNodeIdInvalid` if any of the node ids in the input are invalid. /// /// The call is also given the session that the request was made on. The implementation should /// NOT hold a strong reference to this session, but it can make a weak reference if it desires. /// /// There is no guarantee that the corresponding `OnUnregisterNodes` will be called by the client, /// therefore use the weak session references and a periodic check to perform any housekeeping. fn register_nodes(&mut self, session: Arc<RwLock<Session>>, nodes_to_register: &[NodeId]) -> Result<Vec<NodeId>, StatusCode>; } /// Called by UnregisterNodes service pub trait UnregisterNodes { /// Called when a client calls the UnregisterNodes service. See `OnRegisterNodes` trait for more /// information. A client may not call this function, e.g. if connection breaks so do not /// count on receiving this to perform any housekeeping. /// /// The function should not validate the nodes in the request and should just ignore any /// unregistered nodes. fn unregister_nodes(&mut self, session: Arc<RwLock<Session>>, nodes_to_unregister: &[NodeId]) -> Result<(), StatusCode>; } /// Called by the Method service when it invokes a method pub trait Method { /// A method is registered via the address space to a method id and optionally an object id. /// When a client sends a CallRequest / CallMethod request, the registered object will /// be invoked to handle the call. fn call(&mut self, session: &mut Session, request: &CallMethodRequest) -> Result<CallMethodResult, StatusCode>; }