Browse Source

fix to service_write to handle empty write arrays, added a dummy diagnostic function for services

Stasik0 10 years ago
parent
commit
8a91b4aaa5
2 changed files with 18 additions and 0 deletions
  1. 13 0
      src/server/ua_server_binary.c
  2. 5 0
      src/server/ua_services_attribute.c

+ 13 - 0
src/server/ua_server_binary.c

@@ -126,6 +126,18 @@ static void processOPN(UA_Connection *connection, UA_Server *server, const UA_By
     connection->write(connection, (UA_ByteStringArray){ .stringsSize = 1, .strings = &resp_msg });
 }
 
+static void handle_diagnostics(const UA_RequestHeader *p, UA_ResponseHeader *r){
+	// TODO do it right, we will probably need to to it inside of the service
+	if(p->returnDiagnostics > 0){
+		r->serviceDiagnostics.hasSymbolicId = UA_TRUE;
+		r->serviceDiagnostics.symbolicId = 0;
+		r->stringTableSize = 1;
+		UA_String* namespaceUri = UA_String_new();
+		UA_String_copycstring("TBD", namespaceUri);
+		r->stringTable = namespaceUri;
+	}
+}
+
 static void init_response_header(const UA_RequestHeader *p, UA_ResponseHeader *r) {
     r->requestHandle = p->requestHandle;
     r->serviceResult = UA_STATUSCODE_GOOD;
@@ -151,6 +163,7 @@ static void init_response_header(const UA_RequestHeader *p, UA_ResponseHeader *r
             return;                                                     \
         UA_##TYPE##Response_init(&r);                                   \
         init_response_header(&p.requestHeader, &r.responseHeader);      \
+        handle_diagnostics(&p.requestHeader, &r.responseHeader);											\
         Service_##TYPE(server, clientSession, &p, &r);                  \
         ALLOC_MESSAGE(message, UA_##TYPE##Response_calcSizeBinary(&r)); \
         UA_##TYPE##Response_encodeBinary(&r, message, &sendOffset);     \

+ 5 - 0
src/server/ua_services_attribute.c

@@ -472,6 +472,11 @@ void Service_Write(UA_Server *server, UA_Session *session,
                    const UA_WriteRequest *request, UA_WriteResponse *response) {
     UA_assert(server != UA_NULL && session != UA_NULL && request != UA_NULL && response != UA_NULL);
 
+    if(request->nodesToWriteSize <= 0){
+        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
+        return;
+    }
+
     response->results = UA_Array_new(&UA_TYPES[UA_TYPES_STATUSCODE], request->nodesToWriteSize);
     if(!response->results) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;