Browse Source

PubSub: UA_Server_processNetworkMessage: Handle the case where no dataSetReaderErg is found

Julius Pfrommer 5 years ago
parent
commit
e382587211
1 changed files with 21 additions and 20 deletions
  1. 21 20
      src/pubsub/ua_pubsub.c

+ 21 - 20
src/pubsub/ua_pubsub.c

@@ -402,13 +402,11 @@ UA_Server_processNetworkMessage(UA_Server *server, UA_NetworkMessage *pMsg,
             UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "only 1 DataSetReader available. This one will be used.");
             dataSetReaderErg = LIST_FIRST(&LIST_FIRST(&pConnection->readerGroups)->readers);
             }
-
-        }
-        else {
-            UA_DataSetReader *tmpReader;
+        } else {
             if(publisherIdAvailable) {
-                UA_ReaderGroup* readerGroup = NULL;
+                UA_ReaderGroup* readerGroup;
                 LIST_FOREACH(readerGroup, &pConnection->readerGroups, listEntry) {
+                    UA_DataSetReader *tmpReader;
                     LIST_FOREACH(tmpReader, &readerGroup->readers, listEntry) {
                         if(publisherIdAvailable && (tmpReader->config.publisherId.type != NULL)) {
                             switch (pMsg->publisherIdType) {
@@ -417,59 +415,62 @@ UA_Server_processNetworkMessage(UA_Server *server, UA_NetworkMessage *pMsg,
                                        pMsg->publisherIdType == UA_PUBLISHERDATATYPE_BYTE &&
                                        pMsg->publisherId.publisherIdByte == *(UA_Byte*)tmpReader->config.publisherId.data) {
                                         dataSetReaderErg = tmpReader;
+                                        goto process;
                                     }
                                     break;
-
                                 case UA_PUBLISHERDATATYPE_UINT16:
                                     if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT16] &&
                                        pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT16 &&
                                        pMsg->publisherId.publisherIdUInt16 == *(UA_UInt16*)tmpReader->config.publisherId.data) {
-                                         UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetReader found with PublisherId");
                                          dataSetReaderErg = tmpReader;
+                                         goto process;
                                     }
                                     break;
-
                                 case UA_PUBLISHERDATATYPE_UINT32:
                                     if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT32] &&
                                        pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT32 &&
                                        pMsg->publisherId.publisherIdUInt32 == *(UA_UInt32*)tmpReader->config.publisherId.data) {
-                                        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetReader found with PublisherId");
                                         dataSetReaderErg = tmpReader;
+                                        goto process;
                                     }
                                     break;
-
                                 case UA_PUBLISHERDATATYPE_UINT64:
                                     if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_UINT64] &&
                                        pMsg->publisherIdType == UA_PUBLISHERDATATYPE_UINT64 &&
                                        pMsg->publisherId.publisherIdUInt64 == *(UA_UInt64*)tmpReader->config.publisherId.data) {
-                                        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetReader found with PublisherId");
                                         dataSetReaderErg = tmpReader;
+                                        goto process;
                                     }
                                     break;
-
                                 case UA_PUBLISHERDATATYPE_STRING:
                                     if(tmpReader->config.publisherId.type == &UA_TYPES[UA_TYPES_STRING] &&
                                        pMsg->publisherIdType == UA_PUBLISHERDATATYPE_STRING &&
                                        UA_String_equal(&pMsg->publisherId.publisherIdString, (UA_String*)tmpReader->config.publisherId.data)) {
-                                        UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetReader found with PublisherId");
                                         dataSetReaderErg = tmpReader;
+                                        goto process;
                                     }
                                     break;
-
+                            default:
+                                return UA_STATUSCODE_BADINTERNALERROR;
                             }
                          }
-                         /* to break out of LIST_FOREACH loop */
-                         if(dataSetReaderErg!= NULL) {
-                             break;
-                         }
-
                      }
                  }
              }
          }
 
+        /* No Reader with the specified id found */
+        if(!dataSetReaderErg) {
+            UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "No DataSetReader found with PublisherId");
+            return UA_STATUSCODE_BADNOTFOUND; /* TODO: Check the return code */
+        }
+
+        UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, "DataSetReader found with PublisherId");
+
+ process:
+
         for(UA_Byte iterator = 0; iterator < anzDataSets; iterator++) {
-            UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, "Process Msg with DataSetReader!");
+            UA_LOG_DEBUG(&server->config.logger, UA_LOGCATEGORY_SERVER, "Process Msg with DataSetReader!");
             UA_Server_DataSetReader_process(server, dataSetReaderErg, &pMsg->payload.dataSetPayload.dataSetMessages[iterator]);
         }