Parcourir la source

Server: Take BuildInfo from the server config at runtime

Julius Pfrommer il y a 5 ans
Parent
commit
ffb69bf3a1
1 fichiers modifiés avec 90 ajouts et 29 suppressions
  1. 90 29
      src/server/ua_server_ns0.c

+ 90 - 29
src/server/ua_server_ns0.c

@@ -268,24 +268,79 @@ readStatus(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
         return UA_STATUSCODE_GOOD;
     }
 
-    UA_ServerStatusDataType *statustype = UA_ServerStatusDataType_new();
-    statustype->startTime = server->startTime;
-    statustype->currentTime = UA_DateTime_now();
-    statustype->state = UA_SERVERSTATE_RUNNING;
-    statustype->secondsTillShutdown = 0;
-    UA_BuildInfo_copy(&server->config.buildInfo, &statustype->buildInfo);
-
-    value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE];
-    value->value.arrayLength = 0;
-    value->value.data = statustype;
-    value->value.arrayDimensionsSize = 0;
-    value->value.arrayDimensions = NULL;
-    value->hasValue = true;
     if(sourceTimestamp) {
         value->hasSourceTimestamp = true;
         value->sourceTimestamp = UA_DateTime_now();
     }
-    return UA_STATUSCODE_GOOD;
+
+    void *data = NULL;
+
+    UA_assert(nodeId->identifierType == UA_NODEIDTYPE_NUMERIC);
+
+    switch(nodeId->identifier.numeric) {
+    case UA_NS0ID_SERVER_SERVERSTATUS: {
+        UA_ServerStatusDataType *statustype = UA_ServerStatusDataType_new();
+        if(!statustype)
+            return UA_STATUSCODE_BADOUTOFMEMORY;
+        statustype->startTime = server->startTime;
+        statustype->currentTime = UA_DateTime_now();
+        statustype->state = UA_SERVERSTATE_RUNNING;
+        statustype->secondsTillShutdown = 0;
+        value->value.data = statustype;
+        value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE];
+        value->hasValue = true;
+        return UA_BuildInfo_copy(&server->config.buildInfo, &statustype->buildInfo);
+    }
+
+    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO:
+        value->value.type = &UA_TYPES[UA_TYPES_BUILDINFO];
+        data = &server->config.buildInfo;
+        break;
+
+    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI:
+        value->value.type = &UA_TYPES[UA_TYPES_STRING];
+        data = &server->config.buildInfo.productUri;
+        break;
+
+    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME:
+        value->value.type = &UA_TYPES[UA_TYPES_STRING];
+        data = &server->config.buildInfo.manufacturerName;
+        break;
+
+    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME:
+        value->value.type = &UA_TYPES[UA_TYPES_STRING];
+        data = &server->config.buildInfo.productName;
+        break;
+
+    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION:
+        value->value.type = &UA_TYPES[UA_TYPES_STRING];
+        data = &server->config.buildInfo.softwareVersion;
+        break;
+
+    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER:
+        value->value.type = &UA_TYPES[UA_TYPES_STRING];
+        data = &server->config.buildInfo.buildNumber;
+        break;
+
+    case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE:
+        value->value.type = &UA_TYPES[UA_TYPES_DATETIME];
+        data = &server->config.buildInfo.buildDate;
+        break;
+
+    default:
+        value->hasStatus = true;
+        value->status = UA_STATUSCODE_BADINTERNALERROR;
+        return UA_STATUSCODE_GOOD;
+    }
+
+    value->value.data = UA_new(value->value.type);
+    if(!value->value.data) {
+        value->value.type = NULL;
+        return UA_STATUSCODE_BADOUTOFMEMORY;
+    }
+
+    value->hasValue = true;
+    return UA_copy(data, value->value.data, value->value.type);
 }
 
 #ifdef UA_GENERATED_NAMESPACE_ZERO
@@ -624,7 +679,7 @@ UA_Server_initNS0(UA_Server *server) {
     /* CurrentTime */
     UA_DataSource currentTime = {readCurrentTime, NULL};
     retVal |= UA_Server_setVariableNode_dataSource(server,
-                        UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME), currentTime);
+                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME), currentTime);
 
     /* State */
     UA_ServerState state = UA_SERVERSTATE_RUNNING;
@@ -632,32 +687,38 @@ UA_Server_initNS0(UA_Server *server) {
                                &state, &UA_TYPES[UA_TYPES_SERVERSTATE]);
 
     /* BuildInfo */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO,
-                               &server->config.buildInfo, &UA_TYPES[UA_TYPES_BUILDINFO]);
+    retVal |= UA_Server_setVariableNode_dataSource(server,
+                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), serverStatus);
 
     /* BuildInfo - ProductUri */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI,
-                               &server->config.buildInfo.productUri, &UA_TYPES[UA_TYPES_STRING]);
+    retVal |= UA_Server_setVariableNode_dataSource(server,
+                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI),
+                                                   serverStatus);
 
     /* BuildInfo - ManufacturerName */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME,
-                               &server->config.buildInfo.manufacturerName, &UA_TYPES[UA_TYPES_STRING]);
+    retVal |= UA_Server_setVariableNode_dataSource(server,
+                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME),
+                                                   serverStatus);
 
     /* BuildInfo - ProductName */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME,
-                               &server->config.buildInfo.productName, &UA_TYPES[UA_TYPES_STRING]);
+    retVal |= UA_Server_setVariableNode_dataSource(server,
+                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME),
+                                                   serverStatus);
 
     /* BuildInfo - SoftwareVersion */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION,
-                               &server->config.buildInfo.softwareVersion, &UA_TYPES[UA_TYPES_STRING]);
+    retVal |= UA_Server_setVariableNode_dataSource(server,
+                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION),
+                                                   serverStatus);
 
     /* BuildInfo - BuildNumber */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER,
-                               &server->config.buildInfo.buildNumber, &UA_TYPES[UA_TYPES_STRING]);
+    retVal |= UA_Server_setVariableNode_dataSource(server,
+                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER),
+                                                   serverStatus);
 
     /* BuildInfo - BuildDate */
-    retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE,
-                               &server->config.buildInfo.buildDate, &UA_TYPES[UA_TYPES_DATETIME]);
+    retVal |= UA_Server_setVariableNode_dataSource(server,
+                 UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE),
+                                                   serverStatus);
 
 #ifdef UA_GENERATED_NAMESPACE_ZERO