Browse Source

a bunch of error codes changes for ctt's "attribute services" section

Stasik0 8 years ago
parent
commit
bb33937c22
3 changed files with 12 additions and 5 deletions
  1. 1 1
      src/server/ua_services_attribute.c
  2. 9 2
      src/server/ua_services_subscription.c
  3. 2 2
      src/ua_types.c

+ 1 - 1
src/server/ua_services_attribute.c

@@ -576,7 +576,7 @@ static UA_StatusCode
 CopyAttributeIntoNode(UA_Server *server, UA_Session *session,
 CopyAttributeIntoNode(UA_Server *server, UA_Session *session,
                       UA_Node *node, const UA_WriteValue *wvalue) {
                       UA_Node *node, const UA_WriteValue *wvalue) {
     if(!wvalue->value.hasValue)
     if(!wvalue->value.hasValue)
-        return UA_STATUSCODE_BADNODATA;
+        return UA_STATUSCODE_BADTYPEMISMATCH;
 
 
     void *value = wvalue->value.value.data;
     void *value = wvalue->value.value.data;
     void *target = NULL;
     void *target = NULL;

+ 9 - 2
src/server/ua_services_subscription.c

@@ -128,7 +128,7 @@ setMonitoredItemSettings(UA_Server *server, UA_MonitoredItem *mon,
     MonitoredItem_registerSampleJob(server, mon);
     MonitoredItem_registerSampleJob(server, mon);
 }
 }
 
 
-static const UA_String binaryEncoding = {sizeof("DefaultBinary")-1, (UA_Byte*)"DefaultBinary"};
+static const UA_String binaryEncoding = {sizeof("Default Binary")-1, (UA_Byte*)"Default Binary"};
 static void
 static void
 Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_Subscription *sub,
 Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_Subscription *sub,
                                     const UA_TimestampsToReturn timestampsToReturn,
                                     const UA_TimestampsToReturn timestampsToReturn,
@@ -144,11 +144,18 @@ Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_S
 
 
     /* Check if the encoding is supported */
     /* Check if the encoding is supported */
     if(request->itemToMonitor.dataEncoding.name.length > 0 &&
     if(request->itemToMonitor.dataEncoding.name.length > 0 &&
-       !UA_String_equal(&binaryEncoding, &request->itemToMonitor.dataEncoding.name)) {
+       (!UA_String_equal(&binaryEncoding, &request->itemToMonitor.dataEncoding.name) ||
+       request->itemToMonitor.dataEncoding.namespaceIndex != 0)) {
         result->statusCode = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED;
         result->statusCode = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED;
         return;
         return;
     }
     }
 
 
+    /* Check if the encoding is set for a value */
+    if(request->itemToMonitor.attributeId != UA_ATTRIBUTEID_VALUE && request->itemToMonitor.dataEncoding.name.length > 0){
+        result->statusCode = UA_STATUSCODE_BADDATAENCODINGINVALID;
+        return;
+    }
+
     /* Create the monitoreditem */
     /* Create the monitoreditem */
     UA_MonitoredItem *newMon = UA_MonitoredItem_new();
     UA_MonitoredItem *newMon = UA_MonitoredItem_new();
     if(!newMon) {
     if(!newMon) {

+ 2 - 2
src/ua_types.c

@@ -387,9 +387,9 @@ processRangeDefinition(const UA_Variant *v, const UA_NumericRange range, size_t
         return UA_STATUSCODE_BADINDEXRANGEINVALID;
         return UA_STATUSCODE_BADINDEXRANGEINVALID;
     for(size_t i = 0; i < dims_count; i++) {
     for(size_t i = 0; i < dims_count; i++) {
         if(range.dimensions[i].min > range.dimensions[i].max)
         if(range.dimensions[i].min > range.dimensions[i].max)
-            return UA_STATUSCODE_BADINDEXRANGENODATA;
-        if(range.dimensions[i].max >= dims[i])
             return UA_STATUSCODE_BADINDEXRANGEINVALID;
             return UA_STATUSCODE_BADINDEXRANGEINVALID;
+        if(range.dimensions[i].max >= dims[i])
+            return UA_STATUSCODE_BADINDEXRANGENODATA;
         count *= (range.dimensions[i].max - range.dimensions[i].min) + 1;
         count *= (range.dimensions[i].max - range.dimensions[i].min) + 1;
     }
     }