Sfoglia il codice sorgente

refactoring destroyed stateless addon, fixing it

Stasik0 9 anni fa
parent
commit
f94ed099a7

+ 1 - 1
examples/client_stateless.c

@@ -68,7 +68,7 @@ int main(int argc , char *argv[]) {
 	req.requestHeader.additionalHeader = reqHeaderAdditionalHeader;
 	UA_ExtensionObject_init(&(req.requestHeader.additionalHeader));
 
-	req.nodesToRead= UA_Array_new(&UA_TYPES[UA_TYPES_READVALUEID], 1);
+	req.nodesToRead= UA_Array_new(1, &UA_TYPES[UA_TYPES_READVALUEID]);
 	req.nodesToReadSize = 1;
 
 	UA_ReadValueId_init(&(req.nodesToRead[0]));

+ 1 - 0
src/server/ua_server_binary.c

@@ -498,6 +498,7 @@ processMSG(UA_Connection *connection, UA_Server *server, const UA_ByteString *ms
     if(!session) {
         /* session id 0 -> anonymous session */
         UA_Session_init(&anonymousSession);
+        anonymousSession.sessionId = UA_NODEID_NUMERIC(0,0);
         anonymousSession.channel = channel;
         anonymousSession.activated = true;
         session = &anonymousSession;

+ 13 - 13
src/server/ua_services_attribute.c

@@ -393,35 +393,35 @@ void Service_Read(UA_Server *server, UA_Session *session, const UA_ReadRequest *
 
 #ifdef UA_ENABLE_NONSTANDARD_STATELESS
     /* Add an expiry header for caching */
-    if(session==&anonymousSession){
+    if(session->sessionId.namespaceIndex == 0 && session->sessionId.identifierType == UA_NODEIDTYPE_NUMERIC && session->sessionId.identifier.numeric == 0){
 		UA_ExtensionObject additionalHeader;
 		UA_ExtensionObject_init(&additionalHeader);
-		additionalHeader.typeId = UA_TYPES[UA_TYPES_VARIANT].typeId;
-		additionalHeader.encoding = UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING;
+		additionalHeader.encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
+		additionalHeader.content.encoded.typeId =UA_TYPES[UA_TYPES_VARIANT].typeId;
 
 		UA_Variant variant;
 		UA_Variant_init(&variant);
 
 		UA_DateTime* expireArray = NULL;
-		expireArray = UA_Array_new(&UA_TYPES[UA_TYPES_DATETIME], request->nodesToReadSize);
+		expireArray = UA_Array_new(request->nodesToReadSize, &UA_TYPES[UA_TYPES_DATETIME]);
 		variant.data = expireArray;
 
 		/*expires in 20 seconds*/
-		for(UA_Int32 i = 0;i < response->resultsSize;i++) {
+		for(UA_UInt32 i = 0;i < response->resultsSize;i++) {
 			expireArray[i] = UA_DateTime_now() + 20 * 100 * 1000 * 1000;
 		}
 		UA_Variant_setArray(&variant, expireArray, request->nodesToReadSize, &UA_TYPES[UA_TYPES_DATETIME]);
 
 		size_t offset = 0;
 		UA_ByteString str;
-        UA_ByteString_newMembers(&str, 65536);
-		UA_Variant_encodeBinary(&variant, &str, &offset);
-
-        UA_Array_delete(expireArray, &UA_TYPES[UA_TYPES_DATETIME], request->nodesToReadSize);
-
-		additionalHeader.body = str;
-		additionalHeader.body.length = offset;
-		response->responseHeader.additionalHeader = additionalHeader;
+        UA_ByteString_allocBuffer(&str, 65536);
+        UA_StatusCode retval = UA_encodeBinary(&variant, &UA_TYPES[UA_TYPES_VARIANT], &str, &offset);
+        UA_Array_delete(expireArray, request->nodesToReadSize, &UA_TYPES[UA_TYPES_DATETIME]);
+        if(retval == UA_STATUSCODE_GOOD){
+            additionalHeader.content.encoded.body.data = str.data;
+            additionalHeader.content.encoded.body.length = offset;
+            response->responseHeader.additionalHeader = additionalHeader;
+        }
     }
 #endif
 }