Explorar o código

expiry header is now an array of DATETIME values, one entry for one read result

Stasik0 %!s(int64=10) %!d(string=hai) anos
pai
achega
c9cde021c3
Modificáronse 2 ficheiros con 35 adicións e 31 borrados
  1. 1 31
      src/server/ua_server_binary.c
  2. 34 0
      src/server/ua_services_attribute.c

+ 1 - 31
src/server/ua_server_binary.c

@@ -160,36 +160,6 @@ static void init_response_header(const UA_RequestHeader *p, UA_ResponseHeader *r
         responseType = requestType.identifier.numeric + 3;              \
     } while(0)
 
-#ifdef EXTENSION_STATELESS
-#define INVOKE_SERVICE_EXPIRES(TYPE) do {                               \
-        UA_##TYPE##Request p;                                           \
-        UA_##TYPE##Response r;											\
-        CHECK_PROCESS(UA_##TYPE##Request_decodeBinary(msg, pos, &p),;);	\
-        UA_##TYPE##Response_init(&r);									\
-        init_response_header(&p.requestHeader, &r.responseHeader);		\
-        UA_ExtensionObject additionalHeader; 							\
-        UA_ExtensionObject_init(&additionalHeader);						\
-        additionalHeader.encoding = UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING; \
-        additionalHeader.typeId = UA_NODEIDS[UA_DATETIME];				\
-        /*expires in 20 seconds*/										\
-        UA_DateTime expires = UA_DateTime_now() + 20 * 100 * 1000 * 1000; \
-        UA_ByteString str;												\
-        UA_ByteString_init(&str);										\
-        str.data = UA_malloc(UA_DateTime_calcSizeBinary(&expires));		\
-        str.length = UA_DateTime_calcSizeBinary(&expires);				\
-        UA_UInt32 offset = 0;											\
-        UA_DateTime_encodeBinary(&expires, &str, &offset);				\
-        additionalHeader.body = str;									\
-        r.responseHeader.additionalHeader = additionalHeader;			\
-        Service_##TYPE(server, clientSession, &p, &r);                  \
-        ALLOC_MESSAGE(message, UA_##TYPE##Response_calcSizeBinary(&r)); \
-        UA_##TYPE##Response_encodeBinary(&r, message, &sendOffset);     \
-        UA_##TYPE##Request_deleteMembers(&p);                           \
-        UA_##TYPE##Response_deleteMembers(&r);                          \
-        responseType = requestType.identifier.numeric + 3;				\
-    } while(0)
-#endif
-
 static void processMSG(UA_Connection *connection, UA_Server *server, const UA_ByteString *msg, UA_UInt32 *pos) {
     // 1) Read in the securechannel
     UA_UInt32 secureChannelId;
@@ -243,7 +213,7 @@ static void processMSG(UA_Connection *connection, UA_Server *server, const UA_By
     	//subtract UA_ENCODINGOFFSET_BINARY for binary encoding
     	switch(requestType.identifier.numeric - UA_ENCODINGOFFSET_BINARY) {
     	case UA_READREQUEST_NS0:
-    		INVOKE_SERVICE_EXPIRES(Read);
+    		INVOKE_SERVICE(Read);
     		break;
 
     	case UA_WRITEREQUEST_NS0:

+ 34 - 0
src/server/ua_services_attribute.c

@@ -219,6 +219,40 @@ void Service_Read(UA_Server *server, UA_Session *session, const UA_ReadRequest *
         if(!isExternal[i])
             readValue(server, &request->nodesToRead[i], &response->results[i]);
     }
+
+#ifdef EXTENSION_STATELESS
+    if(session==&anonymousSession){
+		/* expiry header */
+		UA_ExtensionObject additionalHeader;
+		UA_ExtensionObject_init(&additionalHeader);
+		additionalHeader.encoding = UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING;
+		additionalHeader.typeId = UA_NODEIDS[UA_VARIANT];
+
+		UA_Variant variant;
+		UA_Variant_init(&variant);
+		variant.vt = &UA_TYPES[UA_DATETIME];
+		variant.storage.data.arrayLength = request->nodesToReadSize;
+
+		UA_DateTime* expireArray = UA_NULL;
+		UA_Array_new((void**)&expireArray, request->nodesToReadSize,
+												&UA_TYPES[UA_DATETIME]);
+		variant.storage.data.dataPtr = expireArray;
+
+		UA_ByteString str;
+		UA_ByteString_init(&str);
+
+		/*expires in 20 seconds*/
+		for(UA_Int32 i = 0;i < response->resultsSize;i++) {
+			expireArray[i] = UA_DateTime_now() + 20 * 100 * 1000 * 1000;
+		}
+		UA_UInt32 offset = 0;
+		str.data = UA_malloc(UA_Variant_calcSizeBinary(&variant));
+		str.length = UA_Variant_calcSizeBinary(&variant);
+		UA_Variant_encodeBinary(&variant, &str, &offset);
+		additionalHeader.body = str;
+		response->responseHeader.additionalHeader = additionalHeader;
+    }
+#endif
 }
 
 static UA_StatusCode writeValue(UA_Server *server, UA_WriteValue *writeValue) {