Current section
Files
Jump to
Current section
Files
src/opcua_server_space.erl
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% @doc OPCUA Server address space shared amongst all the clients.
%%% @end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-module(opcua_server_space).
-behavior(gen_server).
%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% API Functions
-export([start_link/0]).
-export([add_namespace/2]).
-export([add_nodes/1]).
-export([del_nodes/1]).
-export([add_references/1]).
-export([del_references/1]).
-export([node/1]).
-export([references/1, references/2]).
-export([data_type/1]).
-export([type_descriptor/2]).
-export([schema/1]).
-export([namespace_uri/1]).
-export([namespace_id/1]).
-export([namespaces/0]).
-export([is_subtype/2]).
%% Behaviour gen_server callback functions
-export([init/1]).
-export([handle_call/3]).
-export([handle_cast/2]).
-export([handle_info/2]).
-export([terminate/2]).
%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-include_lib("kernel/include/logger.hrl").
-include("opcua.hrl").
-include("opcua_internal.hrl").
%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
add_namespace(Id, Uri) ->
gen_server:call(?MODULE, {add_namespace, Id, Uri}).
add_nodes(Nodes) ->
gen_server:call(?MODULE, {add_nodes, Nodes}).
del_nodes(NodeIds) ->
gen_server:call(?MODULE, {del_nodes, NodeIds}).
add_references(References) ->
gen_server:call(?MODULE, {add_references, References}).
del_references(References) ->
gen_server:call(?MODULE, {del_references, References}).
node(NodeId) ->
opcua_space_backend:node([?MODULE, opcua_nodeset], NodeId).
references(OriginNode) ->
opcua_space_backend:references([?MODULE, opcua_nodeset], OriginNode, #{}).
references(OriginNode, Opts) ->
opcua_space_backend:references([?MODULE, opcua_nodeset], OriginNode, Opts).
data_type(TypeDescriptorSpec) ->
opcua_space_backend:data_type([?MODULE, opcua_nodeset], TypeDescriptorSpec).
type_descriptor(NodeSpec, Encoding) ->
opcua_space_backend:type_descriptor([?MODULE, opcua_nodeset], NodeSpec, Encoding).
schema(NodeSpec) ->
opcua_space_backend:schema([?MODULE, opcua_nodeset], NodeSpec).
namespace_uri(Id) ->
opcua_space_backend:namespace_uri([?MODULE, opcua_nodeset], Id).
namespace_id(Uri) ->
opcua_space_backend:namespace_id([?MODULE, opcua_nodeset], Uri).
namespaces() ->
opcua_space_backend:namespaces([?MODULE, opcua_nodeset]).
is_subtype(SubTypeSpec, SuperTypeSpec) ->
opcua_space_backend:is_subtype([?MODULE, opcua_nodeset], SubTypeSpec, SuperTypeSpec).
%%% BEHAVIOUR gen_server CALLBACK FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
init([]) ->
{ok, opcua_space_backend:new(?MODULE, [opcua_nodeset])}.
handle_call({add_namespace, Id, Uri}, _From, Space) ->
opcua_space:add_namespace(Space, Id, Uri),
{reply, ok, Space};
handle_call({add_nodes, Nodes}, _From, Space) ->
opcua_space:add_nodes(Space, Nodes),
{reply, ok, Space};
handle_call({del_nodes, NodeIds}, _From, Space) ->
opcua_space:del_nodes(Space, NodeIds),
{reply, ok, Space};
handle_call({add_references, References}, _From, Space) ->
opcua_space:add_references(Space, References),
{reply, ok, Space};
handle_call({del_references, References}, _From, Space) ->
opcua_space:del_references(Space, References),
{reply, ok, Space};
handle_call(stop, _From, Space) ->
{stop, normal, ok, Space}.
handle_cast(Request, _Spaces) ->
error({unknown_cast, Request}).
handle_info(Info, _Spaces) ->
error({unknown_info, Info}).
terminate(_Reason, Space) ->
opcua_space_backend:terminate(Space),
ok.