Bladeren bron

Events: More return value checking in UA_Server_createEvent

Julius Pfrommer 6 jaren geleden
bovenliggende
commit
674f811b0a
1 gewijzigde bestanden met toevoegingen van 31 en 26 verwijderingen
  1. 31 26
      src/server/ua_subscription_events.c

+ 31 - 26
src/server/ua_subscription_events.c

@@ -43,64 +43,69 @@ UA_Event_generateEventId(UA_Server *server, UA_ByteString *generatedId) {
     return UA_STATUSCODE_GOOD;
 }
 
-UA_StatusCode UA_EXPORT
+UA_StatusCode
 UA_Server_createEvent(UA_Server *server, const UA_NodeId eventType, UA_NodeId *outNodeId) {
-    if (!outNodeId) {
+    if(!outNodeId) {
         UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_USERLAND, "outNodeId cannot be NULL!");
         return UA_STATUSCODE_BADINVALIDARGUMENT;
     }
 
-    /* make sure the eventType is a subtype of BaseEventType */
+    /* Make sure the eventType is a subtype of BaseEventType */
     UA_NodeId hasSubtypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
     UA_NodeId baseEventTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEEVENTTYPE);
-    if (!isNodeInTree(&server->config.nodestore, &eventType, &baseEventTypeId, &hasSubtypeId, 1)) {
-        UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_USERLAND, "Event type must be a subtype of BaseEventType!");
+    if(!isNodeInTree(&server->config.nodestore, &eventType, &baseEventTypeId, &hasSubtypeId, 1)) {
+        UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_USERLAND,
+                     "Event type must be a subtype of BaseEventType!");
         return UA_STATUSCODE_BADINVALIDARGUMENT;
     }
 
-    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
-    oAttr.displayName.locale = UA_STRING_NULL;
-    oAttr.displayName.text = UA_STRING_NULL;
-    oAttr.description.locale = UA_STRING_NULL;
-    oAttr.description.text = UA_STRING_NULL;
-
+    /* Create an ObjectNode which represents the event */
     UA_QualifiedName name;
     UA_QualifiedName_init(&name);
-
-    /* create an ObjectNode which represents the event */
+    UA_NodeId newNodeId = UA_NODEID_NULL;
+    UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
     UA_StatusCode retval =
         UA_Server_addObjectNode(server,
-                                UA_NODEID_NULL, /* the user may not have control over the nodeId */
-                                UA_NODEID_NULL, /* an event does not have a parent */
-                                UA_NODEID_NULL, /* an event does not have any references */
+                                UA_NODEID_NULL, /* Set a random unused NodeId */
+                                UA_NODEID_NULL, /* No parent */
+                                UA_NODEID_NULL, /* No parent reference */
                                 name,           /* an event does not have a name */
                                 eventType,      /* the type of the event */
                                 oAttr,          /* default attributes are fine */
                                 NULL,           /* no node context */
-                                outNodeId);
+                                &newNodeId);
 
-    if (retval != UA_STATUSCODE_GOOD) {
+    if(retval != UA_STATUSCODE_GOOD) {
         UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_USERLAND,
                      "Adding event failed. StatusCode %s", UA_StatusCode_name(retval));
         return retval;
     }
 
-    /* find the eventType variableNode */
+    /* Find the eventType variable */
     name = UA_QUALIFIEDNAME(0, "EventType");
-    UA_BrowsePathResult bpr = UA_Server_browseSimplifiedBrowsePath(server, *outNodeId, 1, &name);
+    UA_BrowsePathResult bpr = UA_Server_browseSimplifiedBrowsePath(server, newNodeId, 1, &name);
     if(bpr.statusCode != UA_STATUSCODE_GOOD || bpr.targetsSize < 1) {
+        retval = bpr.statusCode;
         UA_BrowsePathResult_deleteMembers(&bpr);
-        return bpr.statusCode;
+        UA_Server_deleteNode(server, newNodeId, true);
+        UA_NodeId_deleteMembers(&newNodeId);
+        return retval;
     }
+
+    /* Set the EventType */
     UA_Variant value;
     UA_Variant_init(&value);
-    UA_Variant_setScalarCopy(&value, &eventType, &UA_TYPES[UA_TYPES_NODEID]);
-    UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value);
-    UA_Variant_deleteMembers(&value);
+    UA_Variant_setScalar(&value, (void*)(uintptr_t)&eventType, &UA_TYPES[UA_TYPES_NODEID]);
+    retval = UA_Server_writeValue(server, bpr.targets[0].targetId.nodeId, value);
     UA_BrowsePathResult_deleteMembers(&bpr);
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_Server_deleteNode(server, newNodeId, true);
+        UA_NodeId_deleteMembers(&newNodeId);
+        return retval;
+    }
 
-    /* the object is not put in any queues until it is triggered */
-    return retval;
+    *outNodeId = newNodeId;
+    return UA_STATUSCODE_GOOD;
 }
 
 static UA_Boolean