Julius Pfrommer пре 9 година
родитељ
комит
96d5c1b020
3 измењених фајлова са 39 додато и 80 уклоњено
  1. 37 76
      src/ua_services_attribute.c
  2. 1 1
      src/ua_types.h
  3. 1 3
      src/ua_types_encoding_binary.c

+ 37 - 76
src/ua_services_attribute.c

@@ -26,13 +26,12 @@ enum UA_AttributeId {
 	UA_ATTRIBUTEID_USEREXECUTABLE          = 22
 };
 
-#define CHECK_NODECLASS(CLASS) do {                                \
-		if((node->nodeClass & (CLASS)) != 0x00) {                  \
-			v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE; \
-			v.status       = UA_STATUSCODE_BADNOTREADABLE;         \
-		}                                                          \
-		break;                                                     \
-} while(0)
+#define CHECK_NODECLASS(CLASS)									   \
+	if(!(node->nodeClass & (CLASS))) {							   \
+		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;	   \
+		v.status       = UA_STATUSCODE_BADNOTREADABLE;			   \
+		break;													   \
+	}															   \
 
 static UA_DataValue service_read_node(Application *app, const UA_ReadValueId *id) {
 	UA_DataValue v;
@@ -147,6 +146,7 @@ static UA_DataValue service_read_node(Application *app, const UA_ReadValueId *id
 	case UA_ATTRIBUTEID_DATATYPE:
 		CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
 		v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		printf("xxxx: %d", node->nodeClass & (UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE));
 		retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_NODEID],
 		                                  &((UA_VariableTypeNode *)node)->dataType);
 		break;
@@ -248,8 +248,7 @@ UA_Int32 Service_Read(UA_Session *session, const UA_ReadRequest *request,
 	for(UA_Int32 i = 0;i < readsize;i++) {
 		DBG_VERBOSE(printf("service_read - attributeId=%d\n", request->nodesToRead[i].attributeId));
 		DBG_VERBOSE(UA_NodeId_printf("service_read - nodeId=", &(request->nodesToRead[i].nodeId)));
-		response->results[i] = service_read_node(application,
-		                                         &request->nodesToRead[i]);
+		response->results[i] = service_read_node(application, &request->nodesToRead[i]);
 	}
 	response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
 	response->diagnosticInfosSize = 0;
@@ -260,182 +259,144 @@ UA_Int32 Service_Write_writeNode(Application *app, UA_WriteValue *writeValue, UA
 {
 	UA_Int32 retval = UA_SUCCESS;
 	Namespace *ns = UA_indexedList_findValue(app->namespaces, writeValue->nodeId.ns);
-	if(ns==UA_NULL)
-	{
+	if(ns==UA_NULL) {
 		*result = UA_STATUSCODE_BADNODEIDINVALID;
 		return UA_ERROR;
 	}
 
 	const UA_Node *node;
-	if(Namespace_get(ns, &writeValue->nodeId, &node) != UA_SUCCESS){
+	if(Namespace_get(ns, &writeValue->nodeId, &node) != UA_SUCCESS) {
 		return UA_ERROR;
 	}
 
 	switch(writeValue->attributeId) {
 	case UA_ATTRIBUTEID_NODEID:
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){
-
-		}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_NODECLASS:
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){
-
-		}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_BROWSENAME:
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_DISPLAYNAME:
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){
-		}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_DESCRIPTION:
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_WRITEMASK:
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		break;
 
 	case UA_ATTRIBUTEID_USERWRITEMASK:
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_ISABSTRACT:
 
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 
 		break;
 
 	case UA_ATTRIBUTEID_SYMMETRIC:
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_INVERSENAME:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_EVENTNOTIFIER:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_VALUE:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){
-		// TODO: Ensure that the borrowed value is not freed prematurely (multithreading)
-		/* retval |= UA_Variant_borrowSetValue(&v.value, &UA_.types[UA_VARIANT], */
-		/*                                     &((UA_VariableNode *)node)->value); */
-
-#ifdef RASPI
-		//Sten: this is  highly hacked to cope with pthreads
-		//tested only with raspberrypi and boolean
-		*((UA_Boolean*)((UA_VariableNode *)node)->value.data) = *((UA_Boolean*)(writeValue->value.value.data));
-		//it seems that UA_Variant_copy copies the value out of the shared memory
-#else
-		retval |= UA_Variant_copy(&writeValue->value.value, &((UA_VariableNode *)node)->value);
-#endif
-		*result = UA_STATUSCODE_GOOD;
+		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT) {
+			// TODO: Ensure that the borrowed value is not freed prematurely (multithreading)
+			/* retval |= UA_Variant_borrowSetValue(&v.value, &UA_.types[UA_VARIANT], */
+			/*                                     &((UA_VariableNode *)node)->value); */
+			retval |= UA_Variant_copy(&writeValue->value.value, &((UA_VariableNode *)node)->value);
+			*result = UA_STATUSCODE_GOOD;
 		}
 
 		break;
 
 	case UA_ATTRIBUTEID_DATATYPE:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_VALUERANK:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_ACCESSLEVEL:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_USERACCESSLEVEL:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
 		return UA_ERROR;
 		break;
 
 	case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_HISTORIZING:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_EXECUTABLE:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	case UA_ATTRIBUTEID_USEREXECUTABLE:
-
-		if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){}
+		/* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
 		*result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
 		break;
 
 	default:
-
 		*result      = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
 		break;
 	}

+ 1 - 1
src/ua_types.h

@@ -363,7 +363,7 @@ void UA_QualifiedName_printf(char const *label, const UA_QualifiedName *qn);
 
 /* LocalizedText */
 #define UA_LOCALIZEDTEXT_STATIC(VARIABLE, STRING) do { \
-	UA_STRING_STATIC(VARIABLE.locale, "end"); \
+	UA_STRING_STATIC(VARIABLE.locale, "en"); \
 	UA_STRING_STATIC(VARIABLE.text, STRING); } while (0)
 
 UA_Int32 UA_LocalizedText_copycstring(char const *src, UA_LocalizedText *dst);

+ 1 - 3
src/ua_types_encoding_binary.c

@@ -765,10 +765,8 @@ UA_Int32 UA_DataValue_calcSizeBinary(UA_DataValue const *p) {
 		length = sizeof(UA_DataValue);
 	else {           // get decoding size
 		length = sizeof(UA_Byte);
-		if(p->encodingMask & UA_DATAVALUE_ENCODINGMASK_VARIANT) {
-			// FIXME: this one can return with an error value instead of a size
+		if(p->encodingMask & UA_DATAVALUE_ENCODINGMASK_VARIANT)
 			length += UA_Variant_calcSizeBinary(&p->value);
-		}
 		if(p->encodingMask & UA_DATAVALUE_ENCODINGMASK_STATUSCODE)
 			length += sizeof(UA_UInt32);   //dataValue->status
 		if(p->encodingMask & UA_DATAVALUE_ENCODINGMASK_SOURCETIMESTAMP)