/home/travis/build/open62541/open62541/src/server/ua_server_internal.h
Go to the documentation of this file.
00001 #ifndef UA_SERVER_INTERNAL_H_
00002 #define UA_SERVER_INTERNAL_H_
00003 
00004 #include "ua_util.h"
00005 #include "ua_server.h"
00006 #include "ua_session_manager.h"
00007 #include "ua_securechannel_manager.h"
00008 #include "ua_nodestore.h"
00009 
00010 #define PRODUCT_URI "http://open62541.org"
00011 #define ANONYMOUS_POLICY "open62541-anonymous-policy"
00012 #define USERNAME_POLICY "open62541-username-policy"
00013 
00016 typedef struct UA_ExternalNamespace {
00017     UA_UInt16 index;
00018     UA_String url;
00019     UA_ExternalNodeStore externalNodeStore;
00020 } UA_ExternalNamespace;
00021 
00022 // forward declarations
00023 struct TimedWork;
00024 
00025 struct DelayedWork;
00026 
00027 struct UA_Server {
00028     /* Config */
00029     UA_ServerConfig config;
00030     UA_Logger logger;
00031     UA_UInt32 random_seed;
00032 
00033     /* Meta */
00034     UA_DateTime startTime;
00035     UA_DateTime buildDate;
00036     UA_ApplicationDescription description;
00037     UA_Int32 endpointDescriptionsSize;
00038     UA_EndpointDescription *endpointDescriptions;
00039 
00040     /* Communication */
00041     size_t networkLayersSize;
00042     UA_ServerNetworkLayer *networkLayers;
00043 
00044     /* Security */
00045     UA_ByteString serverCertificate;
00046     UA_SecureChannelManager secureChannelManager;
00047     UA_SessionManager sessionManager;
00048 
00049     /* Address Space */
00050     UA_NodeStore *nodestore;
00051     size_t namespacesSize;
00052     UA_String *namespaces;
00053     size_t externalNamespacesSize;
00054     UA_ExternalNamespace *externalNamespaces;
00055 
00056     /* Workload Management */
00057     LIST_HEAD(TimedWorkList, TimedWork) timedWork;
00058 
00059 #ifdef UA_MULTITHREADING
00060     UA_Boolean *running;
00061     UA_UInt16 nThreads;
00062     UA_UInt32 **workerCounters;
00063     struct DelayedWork *delayedWork;
00064 
00065     // worker threads wait on the queue
00066     struct cds_wfcq_head dispatchQueue_head;
00067     struct cds_wfcq_tail dispatchQueue_tail;
00068     pthread_cond_t dispatchQueue_condition; // so the workers don't spin if the queue is empty
00069 #endif
00070 };
00071 
00072 void UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, UA_ByteString *msg);
00073 
00074 UA_AddNodesResult UA_Server_addNodeWithSession(UA_Server *server, UA_Session *session, UA_Node *node,
00075                                                const UA_ExpandedNodeId parentNodeId,
00076                                                const UA_NodeId referenceTypeId);
00077 
00078 UA_AddNodesResult UA_Server_addNode(UA_Server *server, UA_Node *node, const UA_ExpandedNodeId parentNodeId,
00079                                     const UA_NodeId referenceTypeId);
00080 
00081 UA_StatusCode UA_Server_addReferenceWithSession(UA_Server *server, UA_Session *session, const UA_AddReferencesItem *item);
00082 
00083 void UA_Server_deleteTimedWork(UA_Server *server);
00084 
00085 #define ADDREFERENCE(NODEID, REFTYPE_NODEID, TARGET_EXPNODEID) do {     \
00086         UA_AddReferencesItem item;                                      \
00087         UA_AddReferencesItem_init(&item);                               \
00088         item.sourceNodeId = NODEID;                                     \
00089         item.referenceTypeId = REFTYPE_NODEID;                          \
00090         item.isForward = UA_TRUE;                                       \
00091         item.targetNodeId = TARGET_EXPNODEID;                           \
00092         UA_Server_addReference(server, &item);                          \
00093     } while(0)
00094 
00095 #endif /* UA_SERVER_INTERNAL_H_ */