|
@@ -24,14 +24,13 @@ extern "C" {
|
|
|
#include "ua_types.h"
|
|
|
#include "ua_types_generated.h"
|
|
|
#include "ua_nodeids.h"
|
|
|
-#include "ua_connection.h"
|
|
|
#include "ua_log.h"
|
|
|
-
|
|
|
-/**
|
|
|
- * @defgroup server Server
|
|
|
- *
|
|
|
- * @{
|
|
|
- */
|
|
|
+#include "ua_job.h"
|
|
|
+#include "ua_connection.h"
|
|
|
+
|
|
|
+/*********************************/
|
|
|
+/* Initialize and run the server */
|
|
|
+/*********************************/
|
|
|
|
|
|
typedef struct UA_ServerConfig {
|
|
|
UA_Boolean Login_enableAnonymous;
|
|
@@ -47,40 +46,119 @@ typedef struct UA_ServerConfig {
|
|
|
|
|
|
extern UA_EXPORT const UA_ServerConfig UA_ServerConfig_standard;
|
|
|
|
|
|
-struct UA_Server;
|
|
|
-typedef struct UA_Server UA_Server;
|
|
|
-
|
|
|
UA_Server UA_EXPORT * UA_Server_new(UA_ServerConfig config);
|
|
|
void UA_EXPORT UA_Server_setServerCertificate(UA_Server *server, UA_ByteString certificate);
|
|
|
void UA_EXPORT UA_Server_delete(UA_Server *server);
|
|
|
|
|
|
/** Sets the logger used by the server */
|
|
|
void UA_EXPORT UA_Server_setLogger(UA_Server *server, UA_Logger logger);
|
|
|
-UA_Logger UA_EXPORT UA_Server_getLogger(UA_Server *server);
|
|
|
|
|
|
/**
|
|
|
* Runs the main loop of the server. In each iteration, this calls into the networklayers to see if
|
|
|
* jobs have arrived and checks if repeated jobs need to be triggered.
|
|
|
*
|
|
|
* @param server The server object
|
|
|
- *
|
|
|
* @param nThreads The number of worker threads. Is ignored if MULTITHREADING is not activated.
|
|
|
- *
|
|
|
* @param running Points to a boolean value on the heap. When running is set to false, the worker
|
|
|
- * threads and the main loop close and the server is shut down.
|
|
|
- *
|
|
|
+ * threads and the main loop close and the server is shut down.
|
|
|
* @return Indicates whether the server shut down cleanly
|
|
|
- *
|
|
|
*/
|
|
|
UA_StatusCode UA_EXPORT UA_Server_run(UA_Server *server, UA_UInt16 nThreads, UA_Boolean *running);
|
|
|
|
|
|
-/* The prologue part of UA_Server_run (no need to use if you call UA_Server_run) */
|
|
|
+/** The prologue part of UA_Server_run (no need to use if you call UA_Server_run) */
|
|
|
UA_StatusCode UA_EXPORT UA_Server_run_startup(UA_Server *server, UA_UInt16 nThreads, UA_Boolean *running);
|
|
|
-/* The epilogue part of UA_Server_run (no need to use if you call UA_Server_run) */
|
|
|
+
|
|
|
+/** The epilogue part of UA_Server_run (no need to use if you call UA_Server_run) */
|
|
|
UA_StatusCode UA_EXPORT UA_Server_run_shutdown(UA_Server *server, UA_UInt16 nThreads);
|
|
|
-/* One iteration of UA_Server_run (no need to use if you call UA_Server_run) */
|
|
|
+
|
|
|
+/** One iteration of UA_Server_run (no need to use if you call UA_Server_run) */
|
|
|
UA_StatusCode UA_EXPORT UA_Server_run_mainloop(UA_Server *server, UA_Boolean *running);
|
|
|
|
|
|
+/**
|
|
|
+ * @param server The server object.
|
|
|
+ * @param job The job that shall be added.
|
|
|
+ * @param interval The job shall be repeatedly executed with the given interval (in ms). The
|
|
|
+ * interval must be larger than 5ms. The first execution occurs at now() + interval at the
|
|
|
+ * latest.
|
|
|
+ * @param jobId Set to the guid of the repeated job. This can be used to cancel the job later on. If
|
|
|
+ * the pointer is null, the guid is not set.
|
|
|
+ * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code otherwise.
|
|
|
+ */
|
|
|
+UA_StatusCode UA_EXPORT UA_Server_addRepeatedJob(UA_Server *server, UA_Job job,
|
|
|
+ UA_UInt32 interval, UA_Guid *jobId);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Remove repeated job. The entry will be removed asynchronously during the next iteration of the
|
|
|
+ * server main loop.
|
|
|
+ *
|
|
|
+ * @param server The server object.
|
|
|
+ * @param jobId The id of the job that shall be removed.
|
|
|
+ * @return Upon sucess, UA_STATUSCODE_GOOD is returned. An error code otherwise.
|
|
|
+ */
|
|
|
+UA_StatusCode UA_EXPORT UA_Server_removeRepeatedJob(UA_Server *server, UA_Guid jobId);
|
|
|
+
|
|
|
+/**
|
|
|
+ * Interface to the binary network layers. This structure is returned from the
|
|
|
+ * function that initializes the network layer. The layer is already bound to a
|
|
|
+ * specific port and listening. The functions in the structure are never called
|
|
|
+ * in parallel but only sequentially from the server's main loop. So the network
|
|
|
+ * layer does not need to be thread-safe.
|
|
|
+ */
|
|
|
+typedef struct UA_ServerNetworkLayer {
|
|
|
+ UA_String discoveryUrl;
|
|
|
+ UA_Logger logger; ///< Set during _start
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Starts listening on the the networklayer.
|
|
|
+ *
|
|
|
+ * @param nl The network layer
|
|
|
+ * @param logger The logger
|
|
|
+ * @return Returns UA_STATUSCODE_GOOD or an error code.
|
|
|
+ */
|
|
|
+ UA_StatusCode (*start)(struct UA_ServerNetworkLayer *nl, UA_Logger logger);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets called from the main server loop and returns the jobs (accumulated messages and close
|
|
|
+ * events) for dispatch.
|
|
|
+ *
|
|
|
+ * @param nl The network layer
|
|
|
+ * @param jobs When the returned integer is >0, *jobs points to an array of UA_Job of the
|
|
|
+ * returned size.
|
|
|
+ * @param timeout The timeout during which an event must arrive in microseconds
|
|
|
+ * @return The size of the jobs array. If the result is negative, an error has occurred.
|
|
|
+ */
|
|
|
+ size_t (*getJobs)(struct UA_ServerNetworkLayer *nl, UA_Job **jobs, UA_UInt16 timeout);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Closes the network connection and returns all the jobs that need to be finished before the
|
|
|
+ * network layer can be safely deleted.
|
|
|
+ *
|
|
|
+ * @param nl The network layer
|
|
|
+ * @param jobs When the returned integer is >0, jobs points to an array of UA_Job of the
|
|
|
+ * returned size.
|
|
|
+ * @return The size of the jobs array. If the result is negative, an error has occurred.
|
|
|
+ */
|
|
|
+ size_t (*stop)(struct UA_ServerNetworkLayer *nl, UA_Job **jobs);
|
|
|
+
|
|
|
+ /** Deletes the network layer. Call only after a successful shutdown. */
|
|
|
+ void (*deleteMembers)(struct UA_ServerNetworkLayer *nl);
|
|
|
+} UA_ServerNetworkLayer;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Adds a network layer to the server. The network layer is destroyed together
|
|
|
+ * with the server. Do not use it after adding it as it might be moved around on
|
|
|
+ * the heap.
|
|
|
+ */
|
|
|
+void UA_EXPORT UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer *networkLayer);
|
|
|
+
|
|
|
+/** @brief Add a new namespace to the server. Returns the index of the new namespace */
|
|
|
+UA_UInt16 UA_EXPORT UA_Server_addNamespace(UA_Server *server, const char* name);
|
|
|
+
|
|
|
+
|
|
|
+/**********************/
|
|
|
+/* Set Node Callbacks */
|
|
|
+/**********************/
|
|
|
+
|
|
|
/**
|
|
|
* Datasources are the interface to local data providers. It is expected that
|
|
|
* the read and release callbacks are implemented. The write callback can be set
|
|
@@ -93,6 +171,7 @@ typedef struct {
|
|
|
* Copies the data from the source into the provided value.
|
|
|
*
|
|
|
* @param handle An optional pointer to user-defined data for the specific data source
|
|
|
+ * @param nodeid Id of the read node
|
|
|
* @param includeSourceTimeStamp If true, then the datasource is expected to set the source
|
|
|
* timestamp in the returned value
|
|
|
* @param range If not null, then the datasource shall return only a selection of the (nonscalar)
|
|
@@ -102,534 +181,335 @@ typedef struct {
|
|
|
* @return Returns a status code for logging. Error codes intended for the original caller are set
|
|
|
* in the value. If an error is returned, then no releasing of the value is done.
|
|
|
*/
|
|
|
- UA_StatusCode (*read)(void *handle, UA_Boolean includeSourceTimeStamp, const UA_NumericRange *range, UA_DataValue *value);
|
|
|
+ UA_StatusCode (*read)(void *handle, const UA_NodeId nodeid, UA_Boolean includeSourceTimeStamp,
|
|
|
+ const UA_NumericRange *range, UA_DataValue *value);
|
|
|
|
|
|
/**
|
|
|
* Write into a data source. The write member of UA_DataSource can be empty if the operation
|
|
|
* is unsupported.
|
|
|
*
|
|
|
* @param handle An optional pointer to user-defined data for the specific data source
|
|
|
+ * @param nodeid Id of the node being written to
|
|
|
* @param data The data to be written into the data source
|
|
|
* @param range An optional data range. If the data source is scalar or does not support writing
|
|
|
* of ranges, then an error code is returned.
|
|
|
* @return Returns a status code that is returned to the user
|
|
|
*/
|
|
|
- UA_StatusCode (*write)(void *handle, const UA_Variant *data, const UA_NumericRange *range);
|
|
|
+ UA_StatusCode (*write)(void *handle, const UA_NodeId nodeid,
|
|
|
+ const UA_Variant *data, const UA_NumericRange *range);
|
|
|
} UA_DataSource;
|
|
|
|
|
|
-/** @brief Add a new namespace to the server. Returns the index of the new namespace */
|
|
|
-UA_UInt16 UA_EXPORT UA_Server_addNamespace(UA_Server *server, const char* name);
|
|
|
-
|
|
|
-/** Add a reference to the server's address space */
|
|
|
-UA_StatusCode UA_EXPORT UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId,
|
|
|
- const UA_NodeId refTypeId, const UA_ExpandedNodeId targetId);
|
|
|
-
|
|
|
-/** Deletes a node from the nodestore.
|
|
|
- *
|
|
|
- * @param server The server object
|
|
|
- * @param nodeId ID of the node to be deleted
|
|
|
-
|
|
|
- * @return Return UA_STATUSCODE_GOOD if the node was deleted or an appropriate errorcode if the node was not found
|
|
|
- * or cannot be deleted.
|
|
|
- */
|
|
|
UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_deleteNode(UA_Server *server, UA_NodeId nodeId);
|
|
|
+UA_Server_setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId,
|
|
|
+ const UA_DataSource dataSource);
|
|
|
|
|
|
-#define UA_SERVER_DELETENODEALIAS_DECL(TYPE) \
|
|
|
-UA_StatusCode UA_EXPORT UA_Server_delete##TYPE##Node(UA_Server *server, UA_NodeId nodeId);
|
|
|
+/* Value Callbacks can be attach to variable and variable type nodes. If
|
|
|
+ not-null, they are called before reading and after writing respectively */
|
|
|
+typedef struct {
|
|
|
+ void *handle;
|
|
|
+ void (*onRead)(void *handle, const UA_NodeId nodeid,
|
|
|
+ const UA_Variant *data, const UA_NumericRange *range);
|
|
|
+ void (*onWrite)(void *handle, const UA_NodeId nodeid,
|
|
|
+ const UA_Variant *data, const UA_NumericRange *range);
|
|
|
+} UA_ValueCallback;
|
|
|
|
|
|
-UA_SERVER_DELETENODEALIAS_DECL(Object)
|
|
|
-UA_SERVER_DELETENODEALIAS_DECL(Variable)
|
|
|
-UA_SERVER_DELETENODEALIAS_DECL(ReferenceType)
|
|
|
-UA_SERVER_DELETENODEALIAS_DECL(View)
|
|
|
-UA_SERVER_DELETENODEALIAS_DECL(VariableType)
|
|
|
-UA_SERVER_DELETENODEALIAS_DECL(DataType)
|
|
|
+UA_StatusCode UA_EXPORT
|
|
|
+UA_Server_setVariableNode_valueCallback(UA_Server *server, const UA_NodeId nodeId,
|
|
|
+ const UA_ValueCallback callback);
|
|
|
|
|
|
-#ifdef ENABLE_METHODCALLS
|
|
|
-UA_SERVER_DELETENODEALIAS_DECL(Method)
|
|
|
-#endif
|
|
|
+/* The lifecycle management allows to track the instantiation and deletion of
|
|
|
+ object nodes derived from object types. */
|
|
|
+typedef struct {
|
|
|
+ void * (*constructor)(const UA_NodeId instance); ///< Returns the instance handle attached to the node
|
|
|
+ void (*destructor)(const UA_NodeId instance, void *instanceHandle);
|
|
|
+} UA_ObjectLifecycleManagement;
|
|
|
|
|
|
-/** Deletes a copied instance of a node by deallocating it and all its attributes. This assumes that the node was
|
|
|
- * priorly copied using getNodeCopy. To delete nodes that are located in the nodestore, use UA_Server_deleteNode()
|
|
|
- * instead.
|
|
|
- *
|
|
|
- * @param server The server object
|
|
|
- * @param node A copy of any node-type struct created with getNodeCopy; must *not* be managed by the nodestore.
|
|
|
- *
|
|
|
- * @return Return UA_STATUSCODE_GOOD if the node was deleted or an appropriate errorcode if the node was not found
|
|
|
- * or cannot be deleted.
|
|
|
- */
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_deleteNodeCopy(UA_Server *server, void **node);
|
|
|
+UA_StatusCode UA_EXPORT
|
|
|
+UA_Server_setObjectTypeNode_instanceLifecycleManagement(UA_Server *server, UA_NodeId nodeId,
|
|
|
+ UA_ObjectLifecycleManagement olm);
|
|
|
|
|
|
-/** Creates a deep copy of a node located in the nodestore and returns it to the userspace. Note that any manipulation
|
|
|
- * of this copied node is not reflected by the server, but otherwise not accessible attributes of the node's struct
|
|
|
- * can be examined in bulk. node->nodeClass can be used to cast the node to a specific node type. Use
|
|
|
- * UA_Server_deleteNodeCopy() to deallocate this node.
|
|
|
- *
|
|
|
- * @param server The server object
|
|
|
- * @param nodeId ID of the node copy to be copied
|
|
|
- * @param copyInto Pointer to a NULL pointer that will hold the copy of the node on a successfull return.
|
|
|
- *
|
|
|
- * @return Return UA_STATUSCODE_GOOD if the node was copied or an appropriate errorcode if the node was not found
|
|
|
- * or cannot be copied.
|
|
|
- */
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_getNodeCopy(UA_Server *server, UA_NodeId nodeId, void **copyInto);
|
|
|
+/* Iterate over all nodes referenced by parentNodeId by calling the callback
|
|
|
+ function for each child node */
|
|
|
+typedef UA_StatusCode (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean isInverse,
|
|
|
+ UA_NodeId referenceTypeId, void *handle);
|
|
|
|
|
|
-/** A new variable Node with a value passed in variant.
|
|
|
- *
|
|
|
- * @param server The server object
|
|
|
- * @param nodeId The requested nodeId of the new node. Use the numeric id with i=0 to get a new ID from the server.
|
|
|
- * @param browseName The qualified name of this node
|
|
|
- * @param displayName The localized text shown when displaying the node
|
|
|
- * @param description The localized human readable description
|
|
|
- * @param userWriteMask Bitmask defining the user write permissions
|
|
|
- * @param writeMask Bitmask defining the write permissions
|
|
|
- * @param parentNodeId The node under which this node exists ("parent")
|
|
|
- * @param referenceTypeId Reference type used by the parent to reference this node
|
|
|
- * @param value A variant containing the value to be assigned to this node.
|
|
|
- * @param createdNodeId Pointer to a NULL pointer that will hold the copy of the nodeId on a successfull return.
|
|
|
- *
|
|
|
- * @return Return UA_STATUSCODE_GOOD if the node was created or an appropriate error code if not.
|
|
|
- */
|
|
|
UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addVariableNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
|
|
|
+UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId,
|
|
|
+ UA_NodeIteratorCallback callback, void *handle);
|
|
|
|
|
|
- const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+/*******************/
|
|
|
+/* Node Management */
|
|
|
+/*******************/
|
|
|
|
|
|
- UA_Variant *value,
|
|
|
+UA_StatusCode UA_EXPORT
|
|
|
+UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId, const UA_NodeId refTypeId,
|
|
|
+ const UA_ExpandedNodeId targetId, UA_Boolean isForward);
|
|
|
|
|
|
- UA_NodeId *createdNodeId);
|
|
|
+UA_StatusCode UA_EXPORT
|
|
|
+UA_Server_deleteNode(UA_Server *server, const UA_NodeId nodeId, UA_Boolean deleteReferences);
|
|
|
+
|
|
|
+UA_StatusCode UA_EXPORT
|
|
|
+UA_Server_deleteReference(UA_Server *server, const UA_NodeId sourceNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ UA_Boolean isForward, const UA_ExpandedNodeId targetNodeId,
|
|
|
+ UA_Boolean deleteBidirectional);
|
|
|
|
|
|
-// Missing: eventNotifier
|
|
|
+/* Don't use this function. There are typed versions as inline functions. */
|
|
|
UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addObjectNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
|
|
|
+__UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_NodeId requestedNewNodeId,
|
|
|
+ const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
|
|
|
+ const UA_NodeAttributes *attr, const UA_DataType *attributeType, UA_NodeId *outNewNodeId);
|
|
|
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_addVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
+ const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
|
|
|
+ const UA_VariableAttributes attr, UA_NodeId *outNewNodeId) {
|
|
|
+ return __UA_Server_addNode(server, UA_NODECLASS_VARIABLE, requestedNewNodeId, parentNodeId,
|
|
|
+ referenceTypeId, browseName, typeDefinition, (const UA_NodeAttributes*)&attr,
|
|
|
+ &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], outNewNodeId); }
|
|
|
+
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_addVariableTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
+ const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ const UA_QualifiedName browseName, const UA_VariableTypeAttributes attr,
|
|
|
+ UA_NodeId *outNewNodeId) {
|
|
|
+ return __UA_Server_addNode(server, UA_NODECLASS_VARIABLETYPE, requestedNewNodeId, parentNodeId,
|
|
|
+ referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
|
|
|
+ &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], outNewNodeId); }
|
|
|
+
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_addObjectNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
-
|
|
|
- const UA_ExpandedNodeId typeDefinition,
|
|
|
-
|
|
|
- UA_NodeId *createdNodeId);
|
|
|
-
|
|
|
-// Missing: isAbstract, symmetric
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addReferenceTypeNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
|
|
|
-
|
|
|
+ const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
|
|
|
+ const UA_ObjectAttributes attr, UA_NodeId *outNewNodeId) {
|
|
|
+ return __UA_Server_addNode(server, UA_NODECLASS_OBJECT, requestedNewNodeId, parentNodeId,
|
|
|
+ referenceTypeId, browseName, typeDefinition, (const UA_NodeAttributes*)&attr,
|
|
|
+ &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], outNewNodeId); }
|
|
|
+
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_addObjectTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
+ const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ const UA_QualifiedName browseName, const UA_ObjectTypeAttributes attr,
|
|
|
+ UA_NodeId *outNewNodeId) {
|
|
|
+ return __UA_Server_addNode(server, UA_NODECLASS_OBJECTTYPE, requestedNewNodeId, parentNodeId,
|
|
|
+ referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
|
|
|
+ &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], outNewNodeId); }
|
|
|
+
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_addViewNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
+ const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ const UA_QualifiedName browseName, const UA_ViewAttributes attr,
|
|
|
+ UA_NodeId *outNewNodeId) {
|
|
|
+ return __UA_Server_addNode(server, UA_NODECLASS_VIEW, requestedNewNodeId, parentNodeId,
|
|
|
+ referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
|
|
|
+ &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], outNewNodeId); }
|
|
|
+
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_addReferenceTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
-
|
|
|
- const UA_ExpandedNodeId typeDefinition,
|
|
|
- const UA_LocalizedText inverseName,
|
|
|
-
|
|
|
- UA_NodeId *createdNodeId );
|
|
|
+ const UA_QualifiedName browseName, const UA_ReferenceTypeAttributes attr,
|
|
|
+ UA_NodeId *outNewNodeId) {
|
|
|
+ return __UA_Server_addNode(server, UA_NODECLASS_REFERENCETYPE, requestedNewNodeId, parentNodeId,
|
|
|
+ referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
|
|
|
+ &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], outNewNodeId); }
|
|
|
+
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_addDataTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
+ const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ const UA_QualifiedName browseName, const UA_DataTypeAttributes attr,
|
|
|
+ UA_NodeId *outNewNodeId) {
|
|
|
+ return __UA_Server_addNode(server, UA_NODECLASS_DATATYPE, requestedNewNodeId, parentNodeId,
|
|
|
+ referenceTypeId, browseName, UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
|
|
|
+ &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], outNewNodeId); }
|
|
|
|
|
|
UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addObjectTypeNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
|
|
|
-
|
|
|
- const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
-
|
|
|
- const UA_ExpandedNodeId typeDefinition,
|
|
|
- const UA_Boolean isAbstract,
|
|
|
-
|
|
|
- UA_NodeId *createdNodeId );
|
|
|
-
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addVariableTypeNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
|
|
|
+UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
+ const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ const UA_QualifiedName browseName, const UA_NodeId typeDefinition,
|
|
|
+ const UA_VariableAttributes attr, const UA_DataSource dataSource,
|
|
|
+ UA_NodeId *outNewNodeId);
|
|
|
|
|
|
- const UA_NodeId parentNodeId,
|
|
|
- const UA_NodeId referenceTypeId,
|
|
|
-
|
|
|
- UA_Variant *value,
|
|
|
- const UA_Int32 valueRank,
|
|
|
- const UA_Boolean isAbstract,
|
|
|
-
|
|
|
- UA_NodeId *createdNodeId);
|
|
|
+#ifdef ENABLE_METHODCALLS
|
|
|
+typedef UA_StatusCode (*UA_MethodCallback)(void *methodHandle, const UA_NodeId objectId,
|
|
|
+ size_t inputSize, const UA_Variant *input,
|
|
|
+ size_t outputSize, UA_Variant *output);
|
|
|
|
|
|
UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addDataTypeNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
|
|
|
-
|
|
|
- const UA_NodeId parentNodeId,
|
|
|
- const UA_NodeId referenceTypeId,
|
|
|
-
|
|
|
- const UA_ExpandedNodeId typeDefinition,
|
|
|
- const UA_Boolean isAbstract,
|
|
|
-
|
|
|
- UA_NodeId *createdNodeId);
|
|
|
-
|
|
|
+UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
+ const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
|
|
|
+ const UA_QualifiedName browseName, const UA_MethodAttributes attr,
|
|
|
+ UA_MethodCallback method, void *handle,
|
|
|
+ UA_Int32 inputArgumentsSize, const UA_Argument* inputArguments,
|
|
|
+ UA_Int32 outputArgumentsSize, const UA_Argument* outputArguments,
|
|
|
+ UA_NodeId *outNewNodeId);
|
|
|
+#endif
|
|
|
|
|
|
+/*************************/
|
|
|
+/* Write Node Attributes */
|
|
|
+/*************************/
|
|
|
+
|
|
|
+/* The following node attributes cannot be changed once the node is created
|
|
|
+ - NodeClass
|
|
|
+ - NodeId
|
|
|
+ - Symmetric
|
|
|
+ - ContainsNoLoop
|
|
|
+
|
|
|
+ The following attributes cannot be written, as there is no "user" in the server
|
|
|
+ - UserWriteMask
|
|
|
+ - UserAccessLevel
|
|
|
+ - UserExecutable
|
|
|
+
|
|
|
+ The following attributes are currently taken from the value variant:
|
|
|
+ TODO: Handle them independent from the variable, ensure that the implicit constraints hold
|
|
|
+ - DataType
|
|
|
+ - ValueRank
|
|
|
+ - ArrayDimensions
|
|
|
+
|
|
|
+ - Historizing is currently unsupported
|
|
|
+ */
|
|
|
+
|
|
|
+/* Don't use this function. There are typed versions with no additional overhead. */
|
|
|
UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addViewNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
|
|
|
+__UA_Server_writeAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_AttributeId attributeId, const UA_DataType *type, const void *value);
|
|
|
|
|
|
- const UA_NodeId parentNodeId,
|
|
|
- const UA_NodeId referenceTypeId,
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeBrowseNameAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_BROWSENAME, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], &browseName); }
|
|
|
|
|
|
- const UA_ExpandedNodeId typeDefinition,
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeDisplayNameAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_LocalizedText displayName) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_DISPLAYNAME, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &displayName); }
|
|
|
|
|
|
- UA_NodeId *createdNodeId);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeDescriptionAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_LocalizedText description) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_DESCRIPTION, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &description); }
|
|
|
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- const UA_LocalizedText displayName, const UA_LocalizedText description, const UA_UInt32 userWriteMask, const UA_UInt32 writeMask,
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeWriteMaskAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_UInt32 writeMask) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_WRITEMASK, &UA_TYPES[UA_TYPES_UINT32], &writeMask); }
|
|
|
|
|
|
- const UA_NodeId parentNodeId,
|
|
|
- const UA_NodeId referenceTypeId,
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeIsAbstractAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_Boolean isAbstract) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_ISABSTRACT, &UA_TYPES[UA_TYPES_BOOLEAN], &isAbstract); }
|
|
|
|
|
|
- const UA_DataSource dataSource,
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeInverseNameAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_LocalizedText inverseName) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_INVERSENAME, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &inverseName); }
|
|
|
|
|
|
- UA_NodeId *createdNodeId);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeEventNotifierAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_Byte eventNotifier) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER, &UA_TYPES[UA_TYPES_BYTE], &eventNotifier); }
|
|
|
|
|
|
-/* --------------------- */
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addMonodirectionalReference(UA_Server *server, UA_NodeId sourceNodeId,
|
|
|
- UA_ExpandedNodeId targetNodeId, UA_NodeId referenceTypeId,
|
|
|
- UA_Boolean isforward);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeValueAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_Variant value) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_VALUE, &UA_TYPES[UA_TYPES_VARIANT], &value); }
|
|
|
|
|
|
-#ifdef ENABLE_METHODCALLS
|
|
|
-typedef UA_StatusCode (*UA_MethodCallback)(const UA_NodeId objectId, const UA_Variant *input,
|
|
|
- UA_Variant *output, void *handle);
|
|
|
-/** Creates a serverside method including input- and output variable descriptions
|
|
|
- *
|
|
|
- * @param server The server object.
|
|
|
- *
|
|
|
- * @param browseName BrowseName to be used for the new method.
|
|
|
- *
|
|
|
- * @param nodeId Requested NodeId for the new method. If a numeric ID with i=0 is used, the server will assign a random unused id.
|
|
|
- *
|
|
|
- * @param parentNodeId Parent node containing this method. Note that an ObjectNode needs to reference the method with hasProperty in order for the method to be callable.
|
|
|
- *
|
|
|
- * @param referenceTypeId Reference type ID to be used by the parent to reference the new method.
|
|
|
- *
|
|
|
- * @param method Userspace Method/Function of type UA_MethodCallback to be called when a client invokes the method using the Call Service Set.
|
|
|
- *
|
|
|
- * @param inputArgumentsSize Number of input arguments expected to be passed by a calling client.
|
|
|
- *
|
|
|
- * @param inputArguments Description of input arguments expected to be passed by a calling client.
|
|
|
- *
|
|
|
- * @param outputArgumentsSize Description of output arguments expected to be passed by a calling client.
|
|
|
- *
|
|
|
- * @param outputArguments Description of output arguments expected to be passed by a calling client.
|
|
|
- *
|
|
|
- * @param createdNodeId Actual nodeId of the new method node if UA_StatusCode indicates success. Can be used to determine the random unique ID assigned by the server if i=0 was passed as a nodeId.
|
|
|
- *
|
|
|
- */
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addMethodNode(UA_Server *server, const UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId,
|
|
|
- const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask,
|
|
|
- UA_MethodCallback method, void *handle, UA_Int32 inputArgumentsSize, const UA_Argument *inputArguments,
|
|
|
- UA_Int32 outputArgumentsSize, const UA_Argument *outputArguments,
|
|
|
- UA_NodeId *createdNodeId);
|
|
|
-#endif
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeAccessLevelAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_UInt32 accessLevel) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_ACCESSLEVEL, &UA_TYPES[UA_TYPES_UINT32], &accessLevel); }
|
|
|
|
|
|
-#ifndef _HAVE_UA_NODEITERATORCALLBACK_D
|
|
|
-#define _HAVE_UA_NODEITERATORCALLBACK_D
|
|
|
-typedef UA_StatusCode (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, void *handle);
|
|
|
-#endif
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeMinimumSamplingIntervalAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_Double miniumSamplingInterval) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, &UA_TYPES[UA_TYPES_DOUBLE], &miniumSamplingInterval); }
|
|
|
|
|
|
-/** Iterate over all nodes referenced by parentNodeId by calling the callback function for each child node
|
|
|
- *
|
|
|
- * @param server The server object.
|
|
|
- *
|
|
|
- * @param parentNodeId The NodeId of the parent whose references are to be iterated over
|
|
|
- *
|
|
|
- * @param callback The function of type UA_NodeIteratorCallback to be called for each referenced child
|
|
|
- *
|
|
|
- * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code otherwise.
|
|
|
- */
|
|
|
-UA_StatusCode UA_EXPORT UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, UA_NodeIteratorCallback callback, void *handle);
|
|
|
-
|
|
|
-UA_StatusCode UA_EXPORT UA_Server_setAttributeValue(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void *value);
|
|
|
-// Attribute specific macros for setAttribute_are defined in ua_server_addressspace.c
|
|
|
-#define UA_Server_setAttribute_nodeId(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_NODEID, (UA_NodeId *) VALUE);
|
|
|
-#define UA_Server_setAttribute_nodeClass(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_NODECLASS, (UA_NodeClass *) VALUE);
|
|
|
-#define UA_Server_setAttribute_browseName(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_BROWSENAME, (UA_QualifiedName *) VALUE);
|
|
|
-#define UA_Server_setAttribute_displayName(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DISPLAYNAME, (UA_LocalizedText *) VALUE);
|
|
|
-#define UA_Server_setAttribute_description(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DESCRIPTION, (UA_LocalizedText *) VALUE);
|
|
|
-#define UA_Server_setAttribute_writeMask(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_WRITEMASK, (UA_UInt32 *) VALUE);
|
|
|
-#define UA_Server_setAttribute_userWriteMask(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USERWRITEMASK, (UA_UInt32 *) VALUE);
|
|
|
-#define UA_Server_setAttribute_isAbstract(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ISABSTRACT, (UA_Boolean *) VALUE);
|
|
|
-#define UA_Server_setAttribute_symmetric(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_SYMMETRIC, (UA_Boolean *) VALUE);
|
|
|
-#define UA_Server_setAttribute_inverseName(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_INVERSENAME, (UA_LocalizedText *) VALUE);
|
|
|
-#define UA_Server_setAttribute_containsNoLoops(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_CONTAINSNOLOOPS, (UA_Boolean *) VALUE);
|
|
|
-#define UA_Server_setAttribute_eventNotifier(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_EVENTNOTIFIER, (UA_Byte *) VALUE);
|
|
|
-#define UA_Server_setAttribute_value(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_VALUE, (UA_Variant *) VALUE);
|
|
|
-#define UA_Server_setAttribute_dataType(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DATATYPE, (UA_NodeId *) VALUE);
|
|
|
-#define UA_Server_setAttribute_valueRank(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_VALUERANK, (UA_Int32 *) VALUE);
|
|
|
-#define UA_Server_setAttribute_arrayDimensions(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ARRAYDIMENSIONS, (UA_Int32 *) VALUE);
|
|
|
-#define UA_Server_setAttribute_accessLevel(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ACCESSLEVEL, (UA_UInt32 *) VALUE);
|
|
|
-#define UA_Server_setAttribute_userAccessLevel(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USERACCESSLEVEL, (UA_UInt32 *) VALUE);
|
|
|
-#define UA_Server_setAttribute_minimumSamplingInterval(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, (UA_Double *) VALUE);
|
|
|
-#define UA_Server_setAttribute_historizing(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_HISTORIZING, (UA_Boolean *) VALUE);
|
|
|
-#define UA_Server_setAttribute_executable(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_EXECUTABLE, (UA_Boolean *) VALUE);
|
|
|
-#define UA_Server_setAttribute_userExecutable(SERVER, NODEID, VALUE) UA_Server_setAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USEREXECUTABLE, (UA_Boolean *) VALUE);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_writeExecutableAttribute(UA_Server *server, const UA_NodeId nodeId, const UA_Boolean executable) {
|
|
|
+ return __UA_Server_writeAttribute(server, nodeId, UA_ATTRIBUTEID_EXECUTABLE, &UA_TYPES[UA_TYPES_BOOLEAN], &executable); }
|
|
|
|
|
|
-#ifdef ENABLE_METHODCALLS
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_setAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback method, void *handle);
|
|
|
-#endif
|
|
|
+/************************/
|
|
|
+/* Read Node Attributes */
|
|
|
+/************************/
|
|
|
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_setAttribute_DataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource *value);
|
|
|
+/* The following attributes cannot be read, since the "admin" user always has all rights.
|
|
|
+ - UserWriteMask
|
|
|
+ - UserAccessLevel
|
|
|
+ - UserExecutable
|
|
|
+*/
|
|
|
|
|
|
+/* Don't use this function. There are typed versions for every supported attribute. */
|
|
|
UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_getAttributeValue(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void **value);
|
|
|
-#define UA_Server_getAttribute_nodeId(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_NODEID, (UA_NodeId **) VALUE);
|
|
|
-#define UA_Server_getAttribute_nodeClass(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_NODECLASS, (UA_NodeClass **) VALUE);
|
|
|
-#define UA_Server_getAttribute_browseName(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_BROWSENAME, (UA_QualifiedName **) VALUE);
|
|
|
-#define UA_Server_getAttribute_displayName(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DISPLAYNAME, (UA_LocalizedText **) VALUE);
|
|
|
-#define UA_Server_getAttribute_description(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DESCRIPTION, (UA_LocalizedText **) VALUE);
|
|
|
-#define UA_Server_getAttribute_writeMask(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_WRITEMASK, (UA_UInt32 **) VALUE);
|
|
|
-#define UA_Server_getAttribute_userWriteMask(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USERWRITEMASK, (UA_UInt32 **) VALUE);
|
|
|
-#define UA_Server_getAttribute_isAbstract(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ISABSTRACT, (UA_Boolean **) VALUE);
|
|
|
-#define UA_Server_getAttribute_symmetric(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_SYMMETRIC, (UA_Boolean **) VALUE);
|
|
|
-#define UA_Server_getAttribute_inverseName(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_INVERSENAME, (UA_LocalizedText **) VALUE);
|
|
|
-#define UA_Server_getAttribute_containsNoLoops(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_CONTAINSNOLOOPS, (UA_Boolean **) VALUE);
|
|
|
-#define UA_Server_getAttribute_eventNotifier(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_EVENTNOTIFIER, (UA_Byte **) VALUE);
|
|
|
-#define UA_Server_getAttribute_value(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_VALUE, (UA_Variant **) VALUE);
|
|
|
-#define UA_Server_getAttribute_dataType(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_DATATYPE, (UA_NodeId **) VALUE);
|
|
|
-#define UA_Server_getAttribute_valueRank(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_VALUERANK, (UA_Int32 **) VALUE);
|
|
|
-#define UA_Server_getAttribute_arrayDimensions(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ARRAYDIMENSIONS, (UA_Int32 **) VALUE);
|
|
|
-#define UA_Server_getAttribute_accessLevel(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_ACCESSLEVEL, (UA_UInt32 **) VALUE);
|
|
|
-#define UA_Server_getAttribute_userAccessLevel(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USERACCESSLEVEL, (UA_UInt32 **) VALUE);
|
|
|
-#define UA_Server_getAttribute_minimumSamplingInterval(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, (UA_Double **) VALUE);
|
|
|
-#define UA_Server_getAttribute_historizing(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_HISTORIZING, (UA_Boolean **) VALUE);
|
|
|
-#define UA_Server_getAttribute_executable(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_EXECUTABLE, (UA_Boolean **) VALUE);
|
|
|
-#define UA_Server_getAttribute_userExecutable(SERVER, NODEID, VALUE) UA_Server_getAttributeValue(SERVER, NODEID, UA_ATTRIBUTEID_USEREXECUTABLE, (UA_Boolean **) VALUE);
|
|
|
+__UA_Server_readAttribute(UA_Server *server, UA_NodeId nodeId, UA_AttributeId attributeId, void *v);
|
|
|
+
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readNodeIdAttribute(UA_Server *server, UA_NodeId nodeId, UA_NodeId *outNodeId) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_NODEID, outNodeId); }
|
|
|
|
|
|
-#ifdef ENABLE_METHODCALLS
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_getAttribute_method(UA_Server *server, UA_NodeId methodNodeId, UA_MethodCallback *method);
|
|
|
-#endif
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readNodeClassAttribute(UA_Server *server, UA_NodeId nodeId, UA_NodeClass *outNodeClass) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_NODECLASS, outNodeClass); }
|
|
|
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_getAttribute_DataSource(UA_Server *server, UA_NodeId nodeId, UA_DataSource **value);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readBrowseNameAttribute(UA_Server *server, UA_NodeId nodeId, UA_QualifiedName *outBrowseName) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_BROWSENAME, outBrowseName); }
|
|
|
|
|
|
-/** Jobs describe work that is executed once or repeatedly. */
|
|
|
-typedef struct {
|
|
|
- enum {
|
|
|
- UA_JOBTYPE_NOTHING,
|
|
|
- UA_JOBTYPE_DETACHCONNECTION,
|
|
|
- UA_JOBTYPE_BINARYMESSAGE,
|
|
|
- UA_JOBTYPE_METHODCALL,
|
|
|
- UA_JOBTYPE_DELAYEDMETHODCALL,
|
|
|
- } type;
|
|
|
- union {
|
|
|
- UA_Connection *closeConnection;
|
|
|
- struct {
|
|
|
- UA_Connection *connection;
|
|
|
- UA_ByteString message;
|
|
|
- } binaryMessage;
|
|
|
- struct {
|
|
|
- void *data;
|
|
|
- void (*method)(UA_Server *server, void *data);
|
|
|
- } methodCall;
|
|
|
- } job;
|
|
|
-} UA_Job;
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readDisplayNameAttribute(UA_Server *server, UA_NodeId nodeId, UA_LocalizedText *outDisplayName) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_DISPLAYNAME, outDisplayName); }
|
|
|
|
|
|
-/**
|
|
|
- * @param server The server object.
|
|
|
- *
|
|
|
- * @param job Pointer to the job that shall be added. The pointer is not freed but copied to an
|
|
|
- * internal representation.
|
|
|
- *
|
|
|
- * @param interval The job shall be repeatedly executed with the given interval (in ms). The
|
|
|
- * interval must be larger than 5ms. The first execution occurs at now() + interval at the
|
|
|
- * latest.
|
|
|
- *
|
|
|
- * @param jobId Set to the guid of the repeated job. This can be used to cancel the job later on. If
|
|
|
- * the pointer is null, the guid is not set.
|
|
|
- *
|
|
|
- * @return Upon success, UA_STATUSCODE_GOOD is returned. An error code otherwise.
|
|
|
- */
|
|
|
-UA_StatusCode UA_EXPORT UA_Server_addRepeatedJob(UA_Server *server, UA_Job job, UA_UInt32 interval,
|
|
|
- UA_Guid *jobId);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readDescriptionAttribute(UA_Server *server, UA_NodeId nodeId, UA_LocalizedText *outDescription) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_DESCRIPTION, outDescription); }
|
|
|
|
|
|
-/**
|
|
|
- * Remove repeated job. The entry will be removed asynchronously during the
|
|
|
- * next iteration of the server main loop.
|
|
|
- *
|
|
|
- * @param server The server object.
|
|
|
- *
|
|
|
- * @param jobId The id of the job that shall be removed.
|
|
|
- *
|
|
|
- * @return Upon sucess, UA_STATUSCODE_GOOD is returned. An error code otherwise.
|
|
|
- */
|
|
|
-UA_StatusCode UA_EXPORT UA_Server_removeRepeatedJob(UA_Server *server, UA_Guid jobId);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readWriteMaskAttribute(UA_Server *server, UA_NodeId nodeId, UA_UInt32 *outWriteMask) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_WRITEMASK, outWriteMask); }
|
|
|
|
|
|
-/**
|
|
|
- * Interface to the binary network layers. This structure is returned from the
|
|
|
- * function that initializes the network layer. The layer is already bound to a
|
|
|
- * specific port and listening. The functions in the structure are never called
|
|
|
- * in parallel but only sequentially from the server's main loop. So the network
|
|
|
- * layer does not need to be thread-safe.
|
|
|
- */
|
|
|
-typedef struct UA_ServerNetworkLayer {
|
|
|
- void *handle;
|
|
|
- UA_String discoveryUrl;
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readIsAbstractAttribute(UA_Server *server, UA_NodeId nodeId, UA_Boolean *outIsAbstract) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_ISABSTRACT, outIsAbstract); }
|
|
|
|
|
|
- /**
|
|
|
- * Starts listening on the the networklayer.
|
|
|
- *
|
|
|
- * @param nl The network layer
|
|
|
- * @param logger The logger
|
|
|
- * @return Returns UA_STATUSCODE_GOOD or an error code.
|
|
|
- */
|
|
|
- UA_StatusCode (*start)(struct UA_ServerNetworkLayer *nl, UA_Logger *logger);
|
|
|
-
|
|
|
- /**
|
|
|
- * Gets called from the main server loop and returns the jobs (accumulated messages and close
|
|
|
- * events) for dispatch.
|
|
|
- *
|
|
|
- * @param nl The network layer
|
|
|
- * @param jobs When the returned integer is positive, *jobs points to an array of UA_Job of the
|
|
|
- * returned size.
|
|
|
- * @param timeout The timeout during which an event must arrive in microseconds
|
|
|
- * @return The size of the jobs array. If the result is negative, an error has occurred.
|
|
|
- */
|
|
|
- UA_Int32 (*getJobs)(struct UA_ServerNetworkLayer *nl, UA_Job **jobs, UA_UInt16 timeout);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readSymmetricAttribute(UA_Server *server, UA_NodeId nodeId, UA_Boolean *outSymmetric) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_SYMMETRIC, outSymmetric); }
|
|
|
|
|
|
- /**
|
|
|
- * Closes the network connection and returns all the jobs that need to be finished before the
|
|
|
- * network layer can be safely deleted.
|
|
|
- *
|
|
|
- * @param nl The network layer
|
|
|
- * @param jobs When the returned integer is positive, jobs points to an array of UA_Job of the
|
|
|
- * returned size.
|
|
|
- * @return The size of the jobs array. If the result is negative, an error has occurred.
|
|
|
- */
|
|
|
- UA_Int32 (*stop)(struct UA_ServerNetworkLayer *nl, UA_Job **jobs);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readInverseNameAttribute(UA_Server *server, UA_NodeId nodeId, UA_LocalizedText *outInverseName) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_INVERSENAME, outInverseName); }
|
|
|
|
|
|
- /** Deletes the network layer. Call only after a successful shutdown. */
|
|
|
- void (*deleteMembers)(struct UA_ServerNetworkLayer *nl);
|
|
|
-} UA_ServerNetworkLayer;
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readContainsNoLoopAttribute(UA_Server *server, UA_NodeId nodeId, UA_Boolean *outContainsNoLoops) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_CONTAINSNOLOOPS, outContainsNoLoops); }
|
|
|
|
|
|
-/**
|
|
|
- * Adds a network layer to the server. The network layer is destroyed together
|
|
|
- * with the server. Do not use it after adding it as it might be moved around on
|
|
|
- * the heap.
|
|
|
- */
|
|
|
-void UA_EXPORT UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer networkLayer);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readEventNotifierAttribute(UA_Server *server, UA_NodeId nodeId, UA_Byte *outEventNotifier) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER, outEventNotifier); }
|
|
|
|
|
|
-/** @} */
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readValueAttribute(UA_Server *server, UA_NodeId nodeId, UA_Variant *outValue) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_VALUE, outValue); }
|
|
|
|
|
|
-#ifndef __cplusplus /* the external nodestore does not work with c++ so far */
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readDataTypeAttribute(UA_Server *server, UA_NodeId nodeId, UA_NodeId *outDataType) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_DATATYPE, outDataType); }
|
|
|
|
|
|
-/**
|
|
|
- * @ingroup nodestore
|
|
|
- *
|
|
|
- * @defgroup external_nodestore External Nodestore
|
|
|
- *
|
|
|
- * @brief An external application that manages its own data and data model
|
|
|
- *
|
|
|
- * To plug in outside data sources, one can use
|
|
|
- *
|
|
|
- * - VariableNodes with a data source (functions that are called for read and write access)
|
|
|
- * - An external nodestore that is mapped to specific namespaces
|
|
|
- *
|
|
|
- * If no external nodestore is defined for a nodeid, it is always looked up in
|
|
|
- * the "local" nodestore of open62541. Namespace Zero is always in the local
|
|
|
- * nodestore.
|
|
|
- *
|
|
|
- * @{
|
|
|
- */
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readValueRankAttribute(UA_Server *server, UA_NodeId nodeId, UA_Int32 *outValueRank) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_VALUERANK, outValueRank); }
|
|
|
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_addNodes)
|
|
|
-(void *ensHandle, const UA_RequestHeader *requestHeader, UA_AddNodesItem *nodesToAdd, UA_UInt32 *indices,
|
|
|
- UA_UInt32 indicesSize, UA_AddNodesResult* addNodesResults, UA_DiagnosticInfo *diagnosticInfos);
|
|
|
-
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_addReferences)
|
|
|
-(void *ensHandle, const UA_RequestHeader *requestHeader, UA_AddReferencesItem* referencesToAdd,
|
|
|
- UA_UInt32 *indices,UA_UInt32 indicesSize, UA_StatusCode *addReferencesResults,
|
|
|
- UA_DiagnosticInfo *diagnosticInfos);
|
|
|
-
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_deleteNodes)
|
|
|
-(void *ensHandle, const UA_RequestHeader *requestHeader, UA_DeleteNodesItem *nodesToDelete, UA_UInt32 *indices,
|
|
|
- UA_UInt32 indicesSize, UA_StatusCode *deleteNodesResults, UA_DiagnosticInfo *diagnosticInfos);
|
|
|
-
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_deleteReferences)
|
|
|
-(void *ensHandle, const UA_RequestHeader *requestHeader, UA_DeleteReferencesItem *referenceToDelete,
|
|
|
- UA_UInt32 *indices, UA_UInt32 indicesSize, UA_StatusCode deleteReferencesresults,
|
|
|
- UA_DiagnosticInfo *diagnosticInfos);
|
|
|
-
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_readNodes)
|
|
|
-(void *ensHandle, const UA_RequestHeader *requestHeader, UA_ReadValueId *readValueIds, UA_UInt32 *indices,
|
|
|
- UA_UInt32 indicesSize,UA_DataValue *readNodesResults, UA_Boolean timeStampToReturn,
|
|
|
- UA_DiagnosticInfo *diagnosticInfos);
|
|
|
-
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_writeNodes)
|
|
|
-(void *ensHandle, const UA_RequestHeader *requestHeader, UA_WriteValue *writeValues, UA_UInt32 *indices,
|
|
|
- UA_UInt32 indicesSize, UA_StatusCode *writeNodesResults, UA_DiagnosticInfo *diagnosticInfo);
|
|
|
-
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_browseNodes)
|
|
|
-(void *ensHandle, const UA_RequestHeader *requestHeader, UA_BrowseDescription *browseDescriptions,
|
|
|
- UA_UInt32 *indices, UA_UInt32 indicesSize, UA_UInt32 requestedMaxReferencesPerNode,
|
|
|
- UA_BrowseResult *browseResults, UA_DiagnosticInfo *diagnosticInfos);
|
|
|
-
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_translateBrowsePathsToNodeIds)
|
|
|
-(void *ensHandle, const UA_RequestHeader *requestHeader, UA_BrowsePath *browsePath,
|
|
|
- UA_UInt32 *indices, UA_UInt32 indicesSize, UA_BrowsePathResult *browsePathResults, UA_DiagnosticInfo *diagnosticInfos);
|
|
|
-
|
|
|
-typedef UA_Int32 (*UA_ExternalNodeStore_delete)(void *ensHandle);
|
|
|
-
|
|
|
-typedef struct UA_ExternalNodeStore {
|
|
|
- void *ensHandle;
|
|
|
- UA_ExternalNodeStore_addNodes addNodes;
|
|
|
- UA_ExternalNodeStore_deleteNodes deleteNodes;
|
|
|
- UA_ExternalNodeStore_writeNodes writeNodes;
|
|
|
- UA_ExternalNodeStore_readNodes readNodes;
|
|
|
- UA_ExternalNodeStore_browseNodes browseNodes;
|
|
|
- UA_ExternalNodeStore_translateBrowsePathsToNodeIds translateBrowsePathsToNodeIds;
|
|
|
- UA_ExternalNodeStore_addReferences addReferences;
|
|
|
- UA_ExternalNodeStore_deleteReferences deleteReferences;
|
|
|
- UA_ExternalNodeStore_delete destroy;
|
|
|
-} UA_ExternalNodeStore;
|
|
|
-
|
|
|
-#ifdef UA_EXTERNAL_NAMESPACES
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addExternalNamespace(UA_Server *server, UA_UInt16 namespaceIndex, const UA_String *url, UA_ExternalNodeStore *nodeStore);
|
|
|
-#endif /* UA_EXTERNAL_NAMESPACES*/
|
|
|
-/** @} */
|
|
|
+// todo: fetch an array with a length field
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readArrayDimensionsAttribute(UA_Server *server, UA_NodeId nodeId, UA_Int32 *outArrayDimensions) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_ARRAYDIMENSIONS, outArrayDimensions); }
|
|
|
|
|
|
-#endif /* external nodestore */
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readAccessLevelAttribute(UA_Server *server, UA_NodeId nodeId, UA_UInt32 *outAccessLevel) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_ACCESSLEVEL, outAccessLevel); }
|
|
|
|
|
|
-#ifndef _HAVE_UA_INSTANTIONCALLBACK_D
|
|
|
-#define _HAVE_UA_INSTANTIONCALLBACK_D
|
|
|
-typedef UA_StatusCode (*UA_InstantiationCallback)(UA_NodeId objectId, UA_NodeId definitionId, void *handle);
|
|
|
-#endif
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readMinimumSamplingIntervalAttribute(UA_Server *server, UA_NodeId nodeId, UA_Double *outMinimumSamplingInterval) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL, outMinimumSamplingInterval); }
|
|
|
|
|
|
-typedef struct arrayOfNodeIds_s {
|
|
|
- UA_Int32 size;
|
|
|
- UA_NodeId *ids;
|
|
|
-} arrayOfNodeIds;
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readHistorizingAttribute(UA_Server *server, UA_NodeId nodeId, UA_Boolean *outHistorizing) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_HISTORIZING, outHistorizing); }
|
|
|
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_appendInstanceOfSupertype(UA_Server *server, UA_NodeId nodeId, UA_NodeId appendToNodeId,
|
|
|
- arrayOfNodeIds *subtypeRefs, arrayOfNodeIds *componentRefs,
|
|
|
- UA_InstantiationCallback callback, arrayOfNodeIds *instantiatedTypes,
|
|
|
- void *handle);
|
|
|
-
|
|
|
-void UA_EXPORT
|
|
|
-UA_Server_addInstanceOf_instatiateChildNode(UA_Server *server,
|
|
|
- arrayOfNodeIds *subtypeRefs, arrayOfNodeIds *componentRefs, arrayOfNodeIds *typedefRefs,
|
|
|
- UA_NodeId objectRoot, UA_InstantiationCallback callback, void *typeDefNode,
|
|
|
- UA_Boolean instantiateObjects, arrayOfNodeIds *instantiatedTypes, void *handle);
|
|
|
-
|
|
|
-UA_StatusCode UA_EXPORT
|
|
|
-UA_Server_addInstanceOf(UA_Server *server, UA_NodeId nodeId, const UA_QualifiedName browseName,
|
|
|
- UA_LocalizedText displayName, UA_LocalizedText description, const UA_NodeId parentNodeId,
|
|
|
- const UA_NodeId referenceTypeId, UA_UInt32 userWriteMask, UA_UInt32 writeMask,
|
|
|
- const UA_ExpandedNodeId typeDefinition, UA_InstantiationCallback callback, void *handle,
|
|
|
- UA_NodeId *createdNodeId);
|
|
|
+static UA_INLINE UA_StatusCode
|
|
|
+UA_Server_readExecutableAttribute(UA_Server *server, UA_NodeId nodeId, UA_Boolean *outExecutable) {
|
|
|
+ return __UA_Server_readAttribute(server, nodeId, UA_ATTRIBUTEID_EXECUTABLE, outExecutable); }
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
-} // extern "C"
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
#endif /* UA_SERVER_H_ */
|