Explorar el Código

use ua_statuscode as function return values

Julius Pfrommer hace 10 años
padre
commit
0b278ea988

+ 26 - 26
examples/networklayer_tcp.c

@@ -51,22 +51,21 @@ typedef struct TCPConnectionHandle {
 	NetworklayerTCP *layer;
 } TCPConnectionHandle;
 
-UA_Int32 NetworklayerTCP_new(NetworklayerTCP **newlayer, UA_ConnectionConfig localConf,
-							 UA_UInt32 port) {
-    if(!newlayer) return UA_ERROR;
+UA_StatusCode NetworklayerTCP_new(NetworklayerTCP **newlayer, UA_ConnectionConfig localConf,
+                                  UA_UInt32 port) {
     *newlayer = malloc(sizeof(NetworklayerTCP));
     if(*newlayer == UA_NULL)
-        return UA_ERROR;
+        return UA_STATUSCODE_BADOUTOFMEMORY;
 	(*newlayer)->localConf = localConf;
 	(*newlayer)->port = port;
 	(*newlayer)->connectionsSize = 0;
 	(*newlayer)->connections = UA_NULL;
-	return UA_SUCCESS;
+	return UA_STATUSCODE_GOOD;
 }
 
 // copy the array of connections, but _loose_ one. This does not close the
 // actual socket.
-UA_Int32 NetworklayerTCP_remove(NetworklayerTCP *layer, UA_Int32 sockfd) {
+static UA_StatusCode NetworklayerTCP_remove(NetworklayerTCP *layer, UA_Int32 sockfd) {
 	UA_UInt32 index;
 	for(index = 0;index < layer->connectionsSize;index++) {
 		if(layer->connections[index].sockfd == sockfd)
@@ -74,7 +73,7 @@ UA_Int32 NetworklayerTCP_remove(NetworklayerTCP *layer, UA_Int32 sockfd) {
 	}
 
     if(index == layer->connectionsSize)
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     if(layer->connections[index].connection.channel)
         layer->connections[index].connection.channel->connection = UA_NULL;
@@ -89,7 +88,7 @@ UA_Int32 NetworklayerTCP_remove(NetworklayerTCP *layer, UA_Int32 sockfd) {
            sizeof(TCPConnection) * (layer->connectionsSize - index));
     free(layer->connections);
 	layer->connections = newconnections;
-	return UA_SUCCESS;
+	return UA_STATUSCODE_GOOD;
 }
 
 void NetworklayerTCP_delete(NetworklayerTCP *layer) {
@@ -112,7 +111,7 @@ void closeCallback(TCPConnectionHandle *handle) {
 }
 
 /** Callback function */
-UA_Int32 writeCallback(TCPConnectionHandle *handle, UA_ByteStringArray gather_buf) {
+void writeCallback(TCPConnectionHandle *handle, UA_ByteStringArray gather_buf) {
 	UA_UInt32 total_len = 0;
 	UA_UInt32 nWritten = 0;
 #ifdef WIN32
@@ -161,10 +160,9 @@ UA_Int32 writeCallback(TCPConnectionHandle *handle, UA_ByteStringArray gather_bu
 #endif
     for(UA_UInt32 i=0;i<gather_buf.stringsSize;i++)
         free(gather_buf.strings[i].data);
-	return UA_SUCCESS;
 }
 
-UA_Int32 NetworklayerTCP_add(NetworklayerTCP *layer, UA_Int32 newsockfd) {
+static UA_StatusCode NetworklayerTCP_add(NetworklayerTCP *layer, UA_Int32 newsockfd) {
     layer->connectionsSize++;
 	layer->connections = realloc(layer->connections, sizeof(TCPConnection) * layer->connectionsSize);
 	TCPConnection *newconnection = &layer->connections[layer->connectionsSize-1];
@@ -172,34 +170,36 @@ UA_Int32 NetworklayerTCP_add(NetworklayerTCP *layer, UA_Int32 newsockfd) {
 
 	struct TCPConnectionHandle *callbackhandle;
     callbackhandle = malloc(sizeof(struct TCPConnectionHandle));
-	callbackhandle->layer = layer;
+    if(!callbackhandle)
+        return UA_STATUSCODE_BADOUTOFMEMORY;
+    callbackhandle->layer = layer;
 	callbackhandle->sockfd = newsockfd;
 	UA_Connection_init(&newconnection->connection, layer->localConf, callbackhandle,
 					   (UA_Connection_closeCallback)closeCallback, (UA_Connection_writeCallback)writeCallback);
-	return UA_SUCCESS;
+	return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 setNonBlocking(int sockid) {
+static UA_StatusCode setNonBlocking(int sockid) {
 #ifdef WIN32
 	u_long iMode = 1;
 	int opts = IOCTLSOCKET(sockid, FIONBIO, &iMode);
 	if (opts != NO_ERROR){
 		printf("ioctlsocket failed with error: %ld\n", opts);
-		return - 1;
+		return UA_STATUSCODE_BADINTERNALERROR;
 	}
-	return 0;
+	return UA_STATUSCODE_GOOD;
 #else
 	int opts = fcntl(sockid,F_GETFL);
 	if (opts < 0) {
 		perror("fcntl(F_GETFL)");
-		return -1;
+		return UA_STATUSCODE_BADINTERNALERROR;
 	}
 	opts = (opts | O_NONBLOCK);
 	if (fcntl(sockid,F_SETFL,opts) < 0) {
 		perror("fcntl(F_SETFL)");
-		return -1;
+		return UA_STATUSCODE_BADINTERNALERROR;
 	}
-	return 0;
+	return UA_STATUSCODE_GOOD;
 #endif
 }
 
@@ -260,8 +260,8 @@ void setFDSet(NetworklayerTCP *layer) {
     layer->highestfd++;
 }
 
-UA_Int32 NetworkLayerTCP_run(NetworklayerTCP *layer, UA_Server *server, struct timeval tv,
-                             void(*worker)(UA_Server*), UA_Boolean *running) {
+UA_StatusCode NetworkLayerTCP_run(NetworklayerTCP *layer, UA_Server *server, struct timeval tv,
+                                  void(*worker)(UA_Server*), UA_Boolean *running) {
 #ifdef WIN32
 	WORD wVersionRequested;
 	WSADATA wsaData;
@@ -269,12 +269,12 @@ UA_Int32 NetworkLayerTCP_run(NetworklayerTCP *layer, UA_Server *server, struct t
 	WSAStartup(wVersionRequested, &wsaData);
 	if((layer->serversockfd = socket(PF_INET, SOCK_STREAM,0)) == INVALID_SOCKET) {
 		printf("ERROR opening socket, code: %d\n", WSAGetLastError());
-		return UA_ERROR;
+		return UA_STATUSCODE_BADINTERNALERROR;
 	}
 #else
     if((layer->serversockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
 		perror("ERROR opening socket");
-		return UA_ERROR;
+		return UA_STATUSCODE_BADINTERNALERROR;
 	} 
 #endif
 	struct sockaddr_in serv_addr;
@@ -287,13 +287,13 @@ UA_Int32 NetworkLayerTCP_run(NetworklayerTCP *layer, UA_Server *server, struct t
 	if(setsockopt(layer->serversockfd, SOL_SOCKET, SO_REUSEADDR, (const char *)&optval, sizeof(optval)) == -1) {
 		perror("setsockopt");
 		CLOSESOCKET(layer->serversockfd);
-		return UA_ERROR;
+		return UA_STATUSCODE_BADINTERNALERROR;
 	}
 		
 	if(bind(layer->serversockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
 		perror("binding");
 		CLOSESOCKET(layer->serversockfd);
-		return UA_ERROR;
+		return UA_STATUSCODE_BADINTERNALERROR;
 	}
 
 #define MAXBACKLOG 10
@@ -337,5 +337,5 @@ UA_Int32 NetworkLayerTCP_run(NetworklayerTCP *layer, UA_Server *server, struct t
 #ifdef WIN32
 	WSACleanup();
 #endif
-	return UA_SUCCESS;
+	return UA_STATUSCODE_GOOD;
 }

+ 3 - 4
examples/networklayer_tcp.h

@@ -24,10 +24,9 @@ typedef struct NetworklayerTCP NetworklayerTCP;
 #define BINARYCONNECTION_MAX_CHUNK_COUNT 1
 #define BINARYCONNECTION_MAX_MESSAGE_SIZE 8192
 
-UA_Int32 NetworklayerTCP_new(NetworklayerTCP **newlayer, UA_ConnectionConfig localConf,
-							 UA_UInt32 port);
+UA_StatusCode NetworklayerTCP_new(NetworklayerTCP **newlayer, UA_ConnectionConfig localConf, UA_UInt32 port);
 void NetworklayerTCP_delete(NetworklayerTCP *layer);
-UA_Int32 NetworkLayerTCP_run(NetworklayerTCP *layer, UA_Server *server, struct timeval tv,
-							   void(*worker)(UA_Server*), UA_Boolean *running);
+UA_StatusCode NetworkLayerTCP_run(NetworklayerTCP *layer, UA_Server *server, struct timeval tv,
+                                  void(*worker)(UA_Server*), UA_Boolean *running);
 
 #endif /* NETWORKLAYERTCP_H_ */

+ 1 - 0
examples/opcuaClient.c

@@ -9,6 +9,7 @@
 #include <stdlib.h> // pulls in declaration of malloc, free
 #include "ua_transport_generated.h"
 #include "ua_namespace_0.h"
+#include "ua_util.h"
 
 UA_Int32 sendHello(UA_Int32 sock, UA_String *endpointURL) {
 	UA_ByteString *message;

+ 4 - 4
examples/opcuaServer.c

@@ -16,10 +16,10 @@
 #include "logger_stdout.h"
 #include "networklayer_tcp.h"
 
-UA_Boolean running = UA_TRUE;
+UA_Boolean running = 1;
 
 void stopHandler(int sign) {
-	running = UA_FALSE;
+	running = 0;
 }
 
 void serverCallback(UA_Server *server) {
@@ -28,7 +28,7 @@ void serverCallback(UA_Server *server) {
 
 UA_ByteString loadCertificate() {
     UA_ByteString certificate = UA_STRING_NULL;
-	FILE *fp = UA_NULL;
+	FILE *fp = NULL;
 	//FIXME: a potiential bug of locating the certificate, we need to get the path from the server's config
 	fp=fopen("localhost.der", "rb");
 
@@ -99,5 +99,5 @@ int main(int argc, char** argv) {
 	UA_Server_deleteMembers(&server);
 	NetworklayerTCP_delete(nl);
     UA_String_deleteMembers(&endpointUrl);
-	return retval == UA_SUCCESS ? 0 : retval;
+	return retval == UA_STATUSCODE_GOOD ? 0 : retval;
 }

+ 2 - 2
include/ua_connection.h

@@ -64,9 +64,9 @@ typedef struct UA_Connection {
     UA_Connection_closeCallback close;
 } UA_Connection;
 
-UA_Int32 UA_EXPORT UA_Connection_init(UA_Connection *connection, UA_ConnectionConfig localConf, void *callbackHandle,
+UA_StatusCode UA_EXPORT UA_Connection_init(UA_Connection *connection, UA_ConnectionConfig localConf, void *callbackHandle,
                                          UA_Connection_closeCallback close, UA_Connection_writeCallback write);
-UA_Int32 UA_EXPORT UA_Connection_deleteMembers(UA_Connection *connection);
+void UA_EXPORT UA_Connection_deleteMembers(UA_Connection *connection);
 
 // todo: closing a binaryconnection that was closed on the network level
 

+ 2 - 2
include/ua_server.h

@@ -54,8 +54,8 @@ typedef struct UA_Server {
 } UA_Server;
 
 void UA_EXPORT UA_Server_init(UA_Server *server, UA_String *endpointUrl);
-UA_Int32 UA_EXPORT UA_Server_deleteMembers(UA_Server *server);
-UA_Int32 UA_EXPORT UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, const UA_ByteString *msg);
+UA_StatusCode UA_EXPORT UA_Server_deleteMembers(UA_Server *server);
+void UA_EXPORT UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, const UA_ByteString *msg);
 
 /* Services for local use */
 UA_AddNodesResult UA_EXPORT UA_Server_addScalarVariableNode(UA_Server *server, UA_String *browseName, void *value,

+ 53 - 63
include/ua_types.h

@@ -27,6 +27,16 @@ extern "C" {
 #include <stdio.h>
 #endif
 
+/* For internal use */
+#define UA_NULL ((void *)0)
+#define UA_TRUE (42 == 42)
+#define UA_FALSE (!UA_TRUE)
+
+typedef enum UA_EQUALITY {
+    UA_EQUAL,
+    UA_NOT_EQUAL
+} UA_EQUALITY;
+    
 /**
  * @defgroup types Datatypes
  *
@@ -58,27 +68,6 @@ extern "C" {
  * @{
  */
 
-#define UA_NULL ((void *)0)
-
-/* Function return values */
-#define UA_SUCCESS 0
-#define UA_NO_ERROR UA_SUCCESS
-#define UA_ERROR (0x01 << 31)
-#define UA_ERR_INCONSISTENT (UA_ERROR | (0x01 << 1))
-#define UA_ERR_INVALID_VALUE (UA_ERROR | (0x01 << 2))
-#define UA_ERR_NO_MEMORY (UA_ERROR | (0x01 << 3))
-#define UA_ERR_NOT_IMPLEMENTED (UA_ERROR | (0x01 << 4))
-
-/* Boolean values and null */
-#define UA_TRUE (42 == 42)
-#define UA_FALSE (!UA_TRUE)
-
-/* Compare values */
-typedef enum UA_EQUALITY {
-    UA_EQUAL,
-    UA_NOT_EQUAL
-} UA_EQUALITY;
-
 /** @brief A two-state logical value (true or false). */
 typedef _Bool UA_Boolean;
 
@@ -309,20 +298,20 @@ typedef void UA_InvalidType;
 /*************/
 
 #ifdef DEBUG
-#define UA_TYPE_PROTOTYPES(TYPE)                                   \
-    UA_Int32 UA_EXPORT TYPE##_new(TYPE **p);                    \
-    void UA_EXPORT     TYPE##_init(TYPE * p);                   \
-    void UA_EXPORT     TYPE##_delete(TYPE * p);                 \
-    void UA_EXPORT     TYPE##_deleteMembers(TYPE * p);          \
-    UA_Int32 UA_EXPORT TYPE##_copy(const TYPE *src, TYPE *dst); \
-    void UA_EXPORT     TYPE##_print(const TYPE *p, FILE *stream);
+#define UA_TYPE_PROTOTYPES(TYPE)                                     \
+    UA_StatusCode UA_EXPORT TYPE##_new(TYPE **p);                    \
+    void UA_EXPORT TYPE##_init(TYPE * p);                            \
+    void UA_EXPORT TYPE##_delete(TYPE * p);                          \
+    void UA_EXPORT TYPE##_deleteMembers(TYPE * p);                   \
+    UA_StatusCode UA_EXPORT TYPE##_copy(const TYPE *src, TYPE *dst); \
+    void UA_EXPORT TYPE##_print(const TYPE *p, FILE *stream);
 #else
-#define UA_TYPE_PROTOTYPES(TYPE)                          \
-    UA_Int32 UA_EXPORT TYPE##_new(TYPE **p);           \
-    void UA_EXPORT     TYPE##_init(TYPE * p);          \
-    void UA_EXPORT     TYPE##_delete(TYPE * p);        \
-    void UA_EXPORT     TYPE##_deleteMembers(TYPE * p); \
-    UA_Int32 UA_EXPORT TYPE##_copy(const TYPE *src, TYPE *dst);
+#define UA_TYPE_PROTOTYPES(TYPE)                                        \
+    UA_StatusCode UA_EXPORT TYPE##_new(TYPE **p);                       \
+    void UA_EXPORT TYPE##_init(TYPE * p);                               \
+    void UA_EXPORT TYPE##_delete(TYPE * p);                             \
+    void UA_EXPORT TYPE##_deleteMembers(TYPE * p);                      \
+    UA_StatusCode UA_EXPORT TYPE##_copy(const TYPE *src, TYPE *dst);
 #endif
 
 /* Functions for all types */
@@ -359,8 +348,8 @@ UA_TYPE_PROTOTYPES(UA_InvalidType)
         VARIABLE.length = sizeof(STRING)-1;     \
         VARIABLE.data   = (UA_Byte *)STRING; } while(0)
 
-UA_Int32 UA_EXPORT UA_String_copycstring(char const *src, UA_String *dst);
-UA_Int32 UA_EXPORT UA_String_copyprintf(char const *fmt, UA_String *dst, ...);
+UA_StatusCode UA_EXPORT UA_String_copycstring(char const *src, UA_String *dst);
+UA_StatusCode UA_EXPORT UA_String_copyprintf(char const *fmt, UA_String *dst, ...);
 UA_EQUALITY UA_EXPORT UA_String_equal(const UA_String *string1, const UA_String *string2);
 #ifdef DEBUG
 void UA_EXPORT UA_String_printf(char const *label, const UA_String *string);
@@ -382,14 +371,14 @@ typedef struct UA_DateTimeStruct {
     UA_Int16 year;
 } UA_DateTimeStruct;
 UA_DateTimeStruct UA_EXPORT UA_DateTime_toStruct(UA_DateTime time);
-UA_Int32 UA_EXPORT UA_DateTime_toString(UA_DateTime time, UA_String *timeString);
+UA_StatusCode UA_EXPORT UA_DateTime_toString(UA_DateTime time, UA_String *timeString);
 
 /* Guid */
 UA_EQUALITY UA_EXPORT UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2);
 
 /* ByteString */
 UA_EQUALITY UA_EXPORT UA_ByteString_equal(const UA_ByteString *string1, const UA_ByteString *string2);
-UA_Int32 UA_EXPORT UA_ByteString_newMembers(UA_ByteString *p, UA_Int32 length);
+UA_StatusCode UA_EXPORT UA_ByteString_newMembers(UA_ByteString *p, UA_Int32 length);
 #ifdef DEBUG
 void UA_EXPORT UA_ByteString_printf(char *label, const UA_ByteString *string);
 void UA_EXPORT UA_ByteString_printx(char *label, const UA_ByteString *string);
@@ -417,7 +406,7 @@ UA_Boolean UA_EXPORT UA_ExpandedNodeId_isNull(const UA_ExpandedNodeId *p);
 #define UA_QUALIFIEDNAME_STATIC(VARIABLE, STRING) do { \
         VARIABLE.namespaceIndex = 0;                   \
         UA_STRING_STATIC(VARIABLE.name, STRING); } while(0)
-UA_Int32 UA_EXPORT UA_QualifiedName_copycstring(char const *src, UA_QualifiedName *dst);
+UA_StatusCode UA_EXPORT UA_QualifiedName_copycstring(char const *src, UA_QualifiedName *dst);
 #ifdef DEBUG
 void UA_EXPORT UA_QualifiedName_printf(char const *label, const UA_QualifiedName *qn);
 #endif
@@ -427,19 +416,19 @@ void UA_EXPORT UA_QualifiedName_printf(char const *label, const UA_QualifiedName
         UA_STRING_STATIC(VARIABLE.locale, "en");       \
         UA_STRING_STATIC(VARIABLE.text, STRING); } while(0)
 
-UA_Int32 UA_EXPORT UA_LocalizedText_copycstring(char const *src, UA_LocalizedText *dst);
+UA_StatusCode UA_EXPORT UA_LocalizedText_copycstring(char const *src, UA_LocalizedText *dst);
 
 /* Variant */
-UA_Int32 UA_EXPORT UA_Variant_copySetValue(UA_Variant *v, const UA_VTable_Entry *vt, const void *value);
-UA_Int32 UA_EXPORT UA_Variant_copySetArray(UA_Variant *v, const UA_VTable_Entry *vt, UA_Int32 arrayLength, const void *array);
+UA_StatusCode UA_EXPORT UA_Variant_copySetValue(UA_Variant *v, const UA_VTable_Entry *vt, const void *value);
+UA_StatusCode UA_EXPORT UA_Variant_copySetArray(UA_Variant *v, const UA_VTable_Entry *vt, UA_Int32 arrayLength, const void *array);
 
 /* Array operations */
-UA_Int32 UA_EXPORT UA_Array_new(void **p, UA_Int32 noElements, const UA_VTable_Entry *vt);
+UA_StatusCode UA_EXPORT UA_Array_new(void **p, UA_Int32 noElements, const UA_VTable_Entry *vt);
 void UA_EXPORT UA_Array_init(void *p, UA_Int32 noElements, const UA_VTable_Entry *vt);
 void UA_EXPORT UA_Array_delete(void *p, UA_Int32 noElements, const UA_VTable_Entry *vt);
 
 /* @brief The destination array is allocated according to noElements. */
-UA_Int32 UA_EXPORT UA_Array_copy(const void *src, UA_Int32 noElements, const UA_VTable_Entry *vt, void **dst);
+UA_StatusCode UA_EXPORT UA_Array_copy(const void *src, UA_Int32 noElements, const UA_VTable_Entry *vt, void **dst);
 #ifdef DEBUG
 void UA_EXPORT UA_Array_print(const void *p, UA_Int32 noElements, const UA_VTable_Entry *vt, FILE *stream);
 #endif
@@ -452,23 +441,23 @@ typedef struct UA_Encoding {
     /**  Returns the size of the encoded element.*/
     UA_Int32 (*calcSize)(const void *p);
     /** Encodes the type into the destination bytestring. */
-    UA_Int32 (*encode)(const void *src, UA_ByteString *dst, UA_UInt32 *offset);
+    UA_StatusCode (*encode)(const void *src, UA_ByteString *dst, UA_UInt32 *offset);
     /** Decodes a ByteString into an UA datatype. */
-    UA_Int32 (*decode)(const UA_ByteString *src, UA_UInt32 *offset, void *dst);
+    UA_StatusCode (*decode)(const UA_ByteString *src, UA_UInt32 *offset, void *dst);
 } UA_Encoding;
 
 #define UA_ENCODING_BINARY 0 // Binary encoding is always available
 
 struct UA_VTable_Entry {
-    UA_NodeId  typeId;
-    UA_Byte   *name;
-    UA_Int32   (*new)(void **p);
-    void       (*init)(void *p);
-    UA_Int32   (*copy)(void const *src, void *dst);
-    void       (*delete)(void *p);
-    void       (*deleteMembers)(void *p);
+    UA_NodeId     typeId;
+    UA_Byte       *name;
+    UA_StatusCode (*new)(void **p);
+    void          (*init)(void *p);
+    UA_StatusCode (*copy)(void const *src, void *dst);
+    void          (*delete)(void *p);
+    void          (*deleteMembers)(void *p);
 #ifdef DEBUG
-    void       (*print)(const void *p, FILE *stream);
+    void          (*print)(const void *p, FILE *stream);
 #endif
     UA_UInt32  memSize;                        // size of the struct only in memory (no dynamic components)
     UA_Boolean dynMembers;                     // does the type contain members that are dynamically
@@ -487,13 +476,13 @@ struct UA_VTable_Entry {
     UA_TYPE_INIT_DEFAULT(TYPE)           \
     UA_TYPE_NEW_DEFAULT(TYPE)            \
     UA_TYPE_COPY_DEFAULT(TYPE)           \
-
-#define UA_TYPE_NEW_DEFAULT(TYPE)                            \
-    UA_Int32 TYPE##_new(TYPE **p) {                          \
+    
+#define UA_TYPE_NEW_DEFAULT(TYPE)                             \
+    UA_StatusCode TYPE##_new(TYPE **p) {                      \
         if(!(*p = UA_alloc(sizeof(TYPE))))                    \
-            return UA_ERROR;                                 \
-        TYPE##_init(*p);                                     \
-        return UA_SUCCESS;                                   \
+            return UA_STATUSCODE_BADOUTOFMEMORY;              \
+        TYPE##_init(*p);                                      \
+        return UA_STATUSCODE_GOOD;                            \
     }
 
 #define UA_TYPE_INIT_DEFAULT(TYPE) \
@@ -527,10 +516,11 @@ struct UA_VTable_Entry {
 
 /* Use only when the type has no arrays. Otherwise, implement deep copy */
 #define UA_TYPE_COPY_DEFAULT(TYPE)                             \
-    UA_Int32 TYPE##_copy(TYPE const *src, TYPE *dst) {         \
-        if(src == UA_NULL || dst == UA_NULL) return UA_ERROR;  \
+    UA_StatusCode TYPE##_copy(TYPE const *src, TYPE *dst) {    \
+        if(src == UA_NULL || dst == UA_NULL)                   \
+            return UA_STATUSCODE_BADOUTOFMEMORY;               \
         *dst = *src;                                           \
-        return UA_SUCCESS;                                     \
+        return UA_STATUSCODE_GOOD;                             \
     }
 
 #define UA_TYPE_COPY_AS(TYPE, TYPE_AS)                         \

+ 33 - 44
src/server/ua_nodestore.c

@@ -162,9 +162,10 @@ static INLINE void clear_entry(UA_NodeStore *ns, const UA_Node **entry) {
     ns->count--;
 }
 
-/* Returns UA_SUCCESS if an entry was found. Otherwise, UA_ERROR is returned and the "entry"
-   argument points to the first free entry under the NodeId. */
-static INLINE UA_Int32 find_entry(const UA_NodeStore *ns, const UA_NodeId *nodeid, const UA_Node ***entry) {
+/* Returns UA_STATUSCODE_GOOD if an entry was found. Otherwise, An error code is
+   returned and the "entry" argument points to the first free entry under the
+   NodeId. */
+static INLINE UA_StatusCode find_entry(const UA_NodeStore *ns, const UA_NodeId *nodeid, const UA_Node ***entry) {
     hash_t          h     = hash(nodeid);
     UA_UInt32       size  = ns->size;
     hash_t          index = mod(h, size);
@@ -172,12 +173,12 @@ static INLINE UA_Int32 find_entry(const UA_NodeStore *ns, const UA_NodeId *nodei
 
     if(*e == UA_NULL) {
         *entry = e;
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
     }
 
     if(UA_NodeId_equal(&(*e)->nodeId, nodeid) == UA_EQUAL) {
         *entry = e;
-        return UA_SUCCESS;
+        return UA_STATUSCODE_GOOD;
     }
 
     hash_t hash2 = mod2(h, size);
@@ -190,27 +191,26 @@ static INLINE UA_Int32 find_entry(const UA_NodeStore *ns, const UA_NodeId *nodei
 
         if(*e == UA_NULL) {
             *entry = e;
-            return UA_ERROR;
+            return UA_STATUSCODE_BADINTERNALERROR;
         }
 
         if(UA_NodeId_equal(&(*e)->nodeId, nodeid) == UA_EQUAL) {
             *entry = e;
-            return UA_SUCCESS;
+            return UA_STATUSCODE_GOOD;
         }
     }
 
     /* NOTREACHED */
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 /* The following function changes size of memory allocated for the entries and
    repeatedly inserts the table elements. The occupancy of the table after the
-   call will be about 50%. If memory allocation failures occur, this function
-   will return UA_ERROR. */
-static UA_Int32 expand(UA_NodeStore *ns) {
+   call will be about 50%. */
+static UA_StatusCode expand(UA_NodeStore *ns) {
     const UA_Node **nentries;
     int32_t nsize;
-    UA_UInt32       nindex;
+    UA_UInt32 nindex;
 
     const UA_Node **oentries = ns->entries;
     int32_t osize = ns->size;
@@ -219,7 +219,7 @@ static UA_Int32 expand(UA_NodeStore *ns) {
 
     /* Resize only when table after removal of unused elements is either too full or too empty.  */
     if(count * 2 < osize && (count * 8 > osize || osize <= 32))
-        return UA_SUCCESS;
+        return UA_STATUSCODE_GOOD;
 
     nindex = higher_prime_index(count * 2);
     nsize  = primes[nindex];
@@ -243,14 +243,14 @@ static UA_Int32 expand(UA_NodeStore *ns) {
     } while(p < olimit);
 
     UA_free(oentries);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 /**********************/
 /* Exported functions */
 /**********************/
 
-UA_Int32 UA_NodeStore_new(UA_NodeStore **result) {
+UA_StatusCode UA_NodeStore_new(UA_NodeStore **result) {
     UA_NodeStore *ns;
     UA_UInt32     sizePrimeIndex, size;
     if(!(ns = UA_alloc(sizeof(UA_NodeStore))))
@@ -268,10 +268,10 @@ UA_Int32 UA_NodeStore_new(UA_NodeStore **result) {
 
     *ns     = (UA_NodeStore) {ns->entries, size, 0, sizePrimeIndex };
     *result = ns;
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_NodeStore_delete(UA_NodeStore *ns) {
+void UA_NodeStore_delete(UA_NodeStore *ns) {
     UA_UInt32       size    = ns->size;
     const UA_Node **entries = ns->entries;
 
@@ -280,28 +280,24 @@ UA_Int32 UA_NodeStore_delete(UA_NodeStore *ns) {
 
     UA_free(ns->entries);
     UA_free(ns);
-    return UA_SUCCESS;
 }
 
-UA_Int32 UA_NodeStore_insert(UA_NodeStore *ns, UA_Node **node, UA_Byte flags) {
-    if(ns == UA_NULL || node == UA_NULL || *node == UA_NULL)
-        return UA_ERROR;
-
+UA_StatusCode UA_NodeStore_insert(UA_NodeStore *ns, UA_Node **node, UA_Byte flags) {
     if(ns->size * 3 <= ns->count * 4) {
-        if(expand(ns) != UA_SUCCESS)
-            return UA_ERROR;
+        if(expand(ns) != UA_STATUSCODE_GOOD)
+            return UA_STATUSCODE_BADINTERNALERROR;
     }
 
     const UA_Node **entry;
     UA_Int32 found = find_entry(ns, &(*node)->nodeId, &entry);
 
     if(flags & UA_NODESTORE_INSERT_UNIQUE) {
-        if(found == UA_SUCCESS)
-            return UA_ERROR;    /* There is already an entry for that nodeid */
+        if(found == UA_STATUSCODE_GOOD)
+            return UA_STATUSCODE_BADINTERNALERROR;    /* There is already an entry for that nodeid */
         else
             *entry = *node;
     } else {
-        if(found == UA_SUCCESS)
+        if(found == UA_STATUSCODE_GOOD)
             clear_entry(ns, entry);
         *entry = *node;
     }
@@ -310,25 +306,22 @@ UA_Int32 UA_NodeStore_insert(UA_NodeStore *ns, UA_Node **node, UA_Byte flags) {
         *node = UA_NULL;
 
     ns->count++;
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_NodeStore_get(const UA_NodeStore *ns, const UA_NodeId *nodeid, const UA_Node **managedNode) {
+UA_StatusCode UA_NodeStore_get(const UA_NodeStore *ns, const UA_NodeId *nodeid, const UA_Node **managedNode) {
     const UA_Node **entry;
-    if(ns == UA_NULL || nodeid == UA_NULL || managedNode == UA_NULL)
-        return UA_ERROR;
-
-    if(find_entry(ns, nodeid, &entry) != UA_SUCCESS)
-        return UA_ERROR;
+    if(find_entry(ns, nodeid, &entry) != UA_STATUSCODE_GOOD)
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     *managedNode = *entry;
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_NodeStore_remove(UA_NodeStore *ns, const UA_NodeId *nodeid) {
+UA_StatusCode UA_NodeStore_remove(UA_NodeStore *ns, const UA_NodeId *nodeid) {
     const UA_Node **entry;
-    if(find_entry(ns, nodeid, &entry) != UA_SUCCESS)
-        return UA_ERROR;
+    if(find_entry(ns, nodeid, &entry) != UA_STATUSCODE_GOOD)
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     // Check before if deleting the node makes the UA_NodeStore inconsistent.
     clear_entry(ns, entry);
@@ -337,19 +330,15 @@ UA_Int32 UA_NodeStore_remove(UA_NodeStore *ns, const UA_NodeId *nodeid) {
     if(ns->count * 8 < ns->size && ns->size > 32)
         expand(ns);
 
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_NodeStore_iterate(const UA_NodeStore *ns, UA_NodeStore_nodeVisitor visitor) {
-    if(ns == UA_NULL || visitor == UA_NULL)
-        return UA_ERROR;
-
+void UA_NodeStore_iterate(const UA_NodeStore *ns, UA_NodeStore_nodeVisitor visitor) {
     for(UA_UInt32 i = 0;i < ns->size;i++) {
         const UA_Node *node = ns->entries[i];
         if(node != UA_NULL)
             visitor(node);
     }
-    return UA_SUCCESS;
 }
 
 void UA_NodeStore_releaseManagedNode(const UA_Node *managed) {

+ 7 - 7
src/server/ua_nodestore.h

@@ -22,10 +22,10 @@
  */
 
 /** @brief Create a new namespace */
-UA_Int32 UA_NodeStore_new(UA_NodeStore **result);
+UA_StatusCode UA_NodeStore_new(UA_NodeStore **result);
 
 /** @brief Delete the namespace and all nodes in it */
-UA_Int32 UA_NodeStore_delete(UA_NodeStore *ns);
+void UA_NodeStore_delete(UA_NodeStore *ns);
 
 #define UA_NODESTORE_INSERT_UNIQUE 1
 #define UA_NODESTORE_INSERT_GETMANAGED 2
@@ -34,17 +34,17 @@ UA_Int32 UA_NodeStore_delete(UA_NodeStore *ns);
     With the UNIQUE flag, the node is only inserted if the nodeid does not
     already exist. With the GETMANAGED flag, the node pointer is replaced with
     the managed pointer. Otherwise, it is set to UA_NULL. */
-UA_Int32 UA_NodeStore_insert(UA_NodeStore *ns, UA_Node **node, UA_Byte flags);
+UA_StatusCode UA_NodeStore_insert(UA_NodeStore *ns, UA_Node **node, UA_Byte flags);
 
 /** @brief Remove a node from the namespace. Always succeeds, even if the node
     was not found. */
-UA_Int32 UA_NodeStore_remove(UA_NodeStore *ns, const UA_NodeId *nodeid);
+UA_StatusCode UA_NodeStore_remove(UA_NodeStore *ns, const UA_NodeId *nodeid);
 
 /** @brief Retrieve a node (read-only) from the namespace. Nodes are immutable.
     They can only be replaced. After the Node is no longer used, the locked
     entry needs to be released. */
-UA_Int32 UA_NodeStore_get(const UA_NodeStore *ns, const UA_NodeId *nodeid,
-                          const UA_Node **managedNode);
+UA_StatusCode UA_NodeStore_get(const UA_NodeStore *ns, const UA_NodeId *nodeid,
+                               const UA_Node **managedNode);
 
 /** @brief Release a managed node. Do never insert a node that isn't stored in a
     namespace. */
@@ -55,7 +55,7 @@ void UA_NodeStore_releaseManagedNode(const UA_Node *managed);
 typedef void (*UA_NodeStore_nodeVisitor)(const UA_Node *node);
 
 /** @brief Iterate over all nodes in a namespace. */
-UA_Int32 UA_NodeStore_iterate(const UA_NodeStore *ns, UA_NodeStore_nodeVisitor visitor);
+void UA_NodeStore_iterate(const UA_NodeStore *ns, UA_NodeStore_nodeVisitor visitor);
 
 /// @} /* end of group */
 

+ 23 - 24
src/server/ua_securechannel_manager.c

@@ -19,9 +19,9 @@ struct UA_SecureChannelManager {
     UA_UInt32   lastTokenId;
 };
 
-UA_Int32 UA_SecureChannelManager_new(UA_SecureChannelManager **cm, UA_UInt32 maxChannelCount,
-                                     UA_UInt32 tokenLifetime, UA_UInt32 startChannelId,
-                                     UA_UInt32 startTokenId, UA_String *endpointUrl) {
+UA_StatusCode UA_SecureChannelManager_new(UA_SecureChannelManager **cm, UA_UInt32 maxChannelCount,
+                                          UA_UInt32 tokenLifetime, UA_UInt32 startChannelId,
+                                          UA_UInt32 startTokenId, UA_String *endpointUrl) {
     if(!(*cm = UA_alloc(sizeof(UA_SecureChannelManager))))
         return UA_STATUSCODE_BADOUTOFMEMORY;
     UA_SecureChannelManager *channelManager = *cm;
@@ -31,10 +31,10 @@ UA_Int32 UA_SecureChannelManager_new(UA_SecureChannelManager **cm, UA_UInt32 max
     UA_String_copy(endpointUrl, &channelManager->endpointUrl);
     channelManager->maxChannelLifetime = tokenLifetime;
     channelManager->maxChannelCount    = maxChannelCount;
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_SecureChannelManager_delete(UA_SecureChannelManager *cm) {
+void UA_SecureChannelManager_delete(UA_SecureChannelManager *cm) {
     struct channel_list_entry *entry = LIST_FIRST(&cm->channels);
     while(entry) {
         LIST_REMOVE(entry, pointers);
@@ -48,13 +48,12 @@ UA_Int32 UA_SecureChannelManager_delete(UA_SecureChannelManager *cm) {
     }
     UA_String_deleteMembers(&cm->endpointUrl);
     UA_free(cm);
-    return UA_SUCCESS;
 }
 
-UA_Int32 UA_SecureChannelManager_open(UA_SecureChannelManager           *cm,
-                                      UA_Connection                     *conn,
-                                      const UA_OpenSecureChannelRequest *request,
-                                      UA_OpenSecureChannelResponse      *response) {
+UA_StatusCode UA_SecureChannelManager_open(UA_SecureChannelManager           *cm,
+                                           UA_Connection                     *conn,
+                                           const UA_OpenSecureChannelRequest *request,
+                                           UA_OpenSecureChannelResponse      *response) {
     struct channel_list_entry *entry = UA_alloc(sizeof(struct channel_list_entry));
     UA_SecureChannel_init(&entry->channel);
 
@@ -92,17 +91,17 @@ UA_Int32 UA_SecureChannelManager_open(UA_SecureChannelManager           *cm,
 
     conn->channel = &entry->channel;
 
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_SecureChannelManager_renew(UA_SecureChannelManager           *cm,
-                                       UA_Connection                     *conn,
-                                       const UA_OpenSecureChannelRequest *request,
-                                       UA_OpenSecureChannelResponse      *response) {
+UA_StatusCode UA_SecureChannelManager_renew(UA_SecureChannelManager           *cm,
+                                            UA_Connection                     *conn,
+                                            const UA_OpenSecureChannelRequest *request,
+                                            UA_OpenSecureChannelResponse      *response) {
 
     UA_SecureChannel *channel = conn->channel;
     if(channel == UA_NULL)
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     channel->securityToken.tokenId         = cm->lastTokenId++;
     channel->securityToken.createdAt       = UA_DateTime_now(); // todo: is wanted?
@@ -113,23 +112,23 @@ UA_Int32 UA_SecureChannelManager_renew(UA_SecureChannelManager           *cm,
     UA_ByteString_copy(&channel->serverNonce, &response->serverNonce);
     UA_ChannelSecurityToken_copy(&channel->securityToken, &response->securityToken);
 
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId,
-                                     UA_SecureChannel **channel) {
+UA_StatusCode UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId,
+                                          UA_SecureChannel **channel) {
     struct channel_list_entry *entry;
     LIST_FOREACH(entry, &cm->channels, pointers) {
         if(entry->channel.securityToken.channelId == channelId) {
             *channel = &entry->channel;
-            return UA_SUCCESS;
+            return UA_STATUSCODE_GOOD;
         }
     }
     *channel = UA_NULL;
-    return UA_ERROR;
+    return UA_STATUSCODE_BADINTERNALERROR;
 }
 
-UA_Int32 UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId) {
+UA_StatusCode UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId) {
     //TODO lock access
     // TODO: close the binaryconnection if it is still open. So we dö not have stray pointers..
     struct channel_list_entry *entry;
@@ -138,9 +137,9 @@ UA_Int32 UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 ch
             UA_SecureChannel_deleteMembers(&entry->channel);
             LIST_REMOVE(entry, pointers);
             UA_free(entry);
-            return UA_SUCCESS;
+            return UA_STATUSCODE_GOOD;
         }
     }
     //TODO notify server application that secureChannel has been closed part 6 - §7.1.4
-    return UA_ERROR;
+    return UA_STATUSCODE_BADINTERNALERROR;
 }

+ 13 - 13
src/server/ua_securechannel_manager.h

@@ -4,18 +4,18 @@
 #include "ua_server.h"
 #include "ua_securechannel.h"
 
-UA_Int32 UA_SecureChannelManager_new(UA_SecureChannelManager **cm, UA_UInt32 maxChannelCount,
-                                     UA_UInt32 tokenLifetime, UA_UInt32 startChannelId,
-                                     UA_UInt32 startTokenId, UA_String *endpointUrl);
-UA_Int32 UA_SecureChannelManager_delete(UA_SecureChannelManager *cm);
-UA_Int32 UA_SecureChannelManager_open(UA_SecureChannelManager *cm, UA_Connection *conn,
-                                      const UA_OpenSecureChannelRequest *request,
-                                      UA_OpenSecureChannelResponse *response);
-UA_Int32 UA_SecureChannelManager_renew(UA_SecureChannelManager *cm, UA_Connection *conn,
-                                       const UA_OpenSecureChannelRequest *request,
-                                       UA_OpenSecureChannelResponse *response);
-UA_Int32 UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId,
-                                     UA_SecureChannel **channel);
-UA_Int32 UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId);
+UA_StatusCode UA_SecureChannelManager_new(UA_SecureChannelManager **cm, UA_UInt32 maxChannelCount,
+                                          UA_UInt32 tokenLifetime, UA_UInt32 startChannelId,
+                                          UA_UInt32 startTokenId, UA_String *endpointUrl);
+void UA_SecureChannelManager_delete(UA_SecureChannelManager *cm);
+UA_StatusCode UA_SecureChannelManager_open(UA_SecureChannelManager *cm, UA_Connection *conn,
+                                           const UA_OpenSecureChannelRequest *request,
+                                           UA_OpenSecureChannelResponse *response);
+UA_StatusCode UA_SecureChannelManager_renew(UA_SecureChannelManager *cm, UA_Connection *conn,
+                                            const UA_OpenSecureChannelRequest *request,
+                                            UA_OpenSecureChannelResponse *response);
+UA_StatusCode UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId,
+                                          UA_SecureChannel **channel);
+UA_StatusCode UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId);
 
 #endif /* UA_CHANNEL_MANAGER_H_ */

+ 2 - 2
src/server/ua_server.c

@@ -6,13 +6,13 @@
 #include "ua_util.h"
 #include "ua_services.h"
 
-UA_Int32 UA_Server_deleteMembers(UA_Server *server) {
+UA_StatusCode UA_Server_deleteMembers(UA_Server *server) {
     UA_ApplicationDescription_deleteMembers(&server->description);
     UA_SecureChannelManager_delete(server->secureChannelManager);
     UA_SessionManager_delete(server->sessionManager);
     UA_NodeStore_delete(server->nodestore);
     UA_ByteString_deleteMembers(&server->serverCertificate);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 void UA_Server_init(UA_Server *server, UA_String *endpointUrl) {

+ 9 - 11
src/server/ua_server_binary.c

@@ -6,18 +6,18 @@
 #include "ua_session_manager.h"
 #include "ua_util.h"
 
-static UA_Int32 UA_ByteStringArray_deleteMembers(UA_ByteStringArray *stringarray) {
+static UA_StatusCode UA_ByteStringArray_deleteMembers(UA_ByteStringArray *stringarray) {
     if(!stringarray)
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
     for(UA_UInt32 i = 0;i < stringarray->stringsSize;i++)
         UA_String_deleteMembers(&stringarray->strings[i]);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 static void processHello(UA_Connection *connection, const UA_ByteString *msg,
                          UA_UInt32 *pos) {
     UA_TcpHelloMessage helloMessage;
-    if(UA_TcpHelloMessage_decodeBinary(msg, pos, &helloMessage) != UA_SUCCESS) {
+    if(UA_TcpHelloMessage_decodeBinary(msg, pos, &helloMessage) != UA_STATUSCODE_GOOD) {
         connection->close(connection->callbackHandle);
         return;
     }
@@ -126,7 +126,7 @@ static void init_response_header(const UA_RequestHeader *p, UA_ResponseHeader *r
 }
 
 #define CHECK_PROCESS(CODE, CLEANUP) \
-    do { if(CODE != UA_SUCCESS) {    \
+    do { if(CODE != UA_STATUSCODE_GOOD) {    \
             CLEANUP;                 \
             return;                  \
         } } while(0)
@@ -246,7 +246,6 @@ static void processMessage(UA_Connection *connection, UA_Server *server, const U
     }
     break;
 
-
     case UA_READREQUEST_NS0:
         INVOKE_SERVICE(Read);
         break;
@@ -342,15 +341,15 @@ static void processClose(UA_Connection *connection, UA_Server *server, const UA_
 	Service_CloseSecureChannel(server, secureChannelId);
 }
 
-UA_Int32 UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, const UA_ByteString *msg) {
-    UA_Int32  retval = UA_SUCCESS;
+void UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, const UA_ByteString *msg) {
+    UA_Int32  retval = UA_STATUSCODE_GOOD;
     UA_UInt32 pos    = 0;
     UA_TcpMessageHeader tcpMessageHeader;
     // todo: test how far pos advanced must be equal to what is said in the messageheader
     do {
         retval = UA_TcpMessageHeader_decodeBinary(msg, &pos, &tcpMessageHeader);
         UA_UInt32 targetpos = pos - 8 + tcpMessageHeader.messageSize;
-        if(retval == UA_SUCCESS) {
+        if(retval == UA_STATUSCODE_GOOD) {
             // none of the process-functions returns an error its all contained inside.
             switch(tcpMessageHeader.messageType) {
             case UA_MESSAGETYPE_HEL:
@@ -374,7 +373,7 @@ UA_Int32 UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connec
                 connection->state = UA_CONNECTION_CLOSING;
                 processClose(connection, server, msg, &pos);
                 connection->close(connection->callbackHandle);
-                return retval;
+                return;
             }
             UA_TcpMessageHeader_deleteMembers(&tcpMessageHeader);
         } else {
@@ -389,5 +388,4 @@ UA_Int32 UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connec
             pos = targetpos;
         }
     } while(msg->length > (UA_Int32)pos);
-    return retval;
 }

+ 33 - 46
src/server/ua_services_attribute.c

@@ -42,12 +42,12 @@ static UA_DataValue service_read_node(UA_Server *server, const UA_ReadValueId *i
 
     UA_Node const *node   = UA_NULL;
     UA_Int32       result = UA_NodeStore_get(server->nodestore, &(id->nodeId), &node);
-    if(result != UA_SUCCESS || node == UA_NULL) {
+    if(result != UA_STATUSCODE_GOOD || node == UA_NULL) {
         v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
         v.status       = UA_STATUSCODE_BADNODEIDUNKNOWN;
         return v;
     }
-    UA_Int32 retval = UA_SUCCESS;
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
 
     switch(id->attributeId) {
     case UA_ATTRIBUTEID_NODEID:
@@ -203,7 +203,7 @@ static UA_DataValue service_read_node(UA_Server *server, const UA_ReadValueId *i
 
     UA_NodeStore_releaseManagedNode(node);
 
-    if(retval != UA_SUCCESS) {
+    if(retval != UA_STATUSCODE_GOOD) {
         v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
         v.status       = UA_STATUSCODE_BADNOTREADABLE;
     }
@@ -220,7 +220,7 @@ void Service_Read(UA_Server *server, UA_Session *session,
         return;
     }
 
-    if(UA_Array_new((void **)&response->results, request->nodesToReadSize, &UA_[UA_DATAVALUE]) != UA_SUCCESS) {
+    if(UA_Array_new((void **)&response->results, request->nodesToReadSize, &UA_[UA_DATAVALUE]) != UA_STATUSCODE_GOOD) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         return;
     }
@@ -230,139 +230,127 @@ void Service_Read(UA_Server *server, UA_Session *session,
         response->results[i] = service_read_node(server, &request->nodesToRead[i]);
 }
 
-UA_Int32 Service_Write_writeNode(UA_Server *server, UA_WriteValue *writeValue,
-                                 UA_StatusCode *result) {
-    UA_Int32 retval = UA_SUCCESS;
+static UA_StatusCode Service_Write_writeNode(UA_Server *server, UA_WriteValue *writeValue) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
     const UA_Node *node;
-    if(UA_NodeStore_get(server->nodestore, &writeValue->nodeId, &node) != UA_SUCCESS)
-        return UA_ERROR;
+    retval = UA_NodeStore_get(server->nodestore, &writeValue->nodeId, &node);
+    if(retval)
+        return retval;
 
     switch(writeValue->attributeId) {
     case UA_ATTRIBUTEID_NODEID:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_NODECLASS:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){ } */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_BROWSENAME:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_DISPLAYNAME:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_DESCRIPTION:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_WRITEMASK:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_USERWRITEMASK:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_ISABSTRACT:
-
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_SYMMETRIC:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_INVERSENAME:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_EVENTNOTIFIER:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_VALUE:
         if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT) {
             retval |= UA_Variant_copy(&writeValue->value.value, &((UA_VariableNode *)node)->value); // todo: zero-copy
-            *result = UA_STATUSCODE_GOOD;
         }
-
         break;
 
     case UA_ATTRIBUTEID_DATATYPE:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_VALUERANK:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_ACCESSLEVEL:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_USERACCESSLEVEL:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
-        return UA_ERROR;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_HISTORIZING:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_EXECUTABLE:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     case UA_ATTRIBUTEID_USEREXECUTABLE:
         /* if(writeValue->value.encodingMask == UA_DATAVALUE_ENCODINGMASK_VARIANT){} */
-        *result = UA_STATUSCODE_BADWRITENOTSUPPORTED;
+        retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
         break;
 
     default:
-        *result = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
+        retval = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
         break;
     }
 
@@ -375,13 +363,12 @@ 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(UA_Array_new((void **)&response->results, request->nodesToWriteSize, &UA_[UA_STATUSCODE])
-       != UA_SUCCESS) {
+    if(UA_Array_new((void **)&response->results, request->nodesToWriteSize, &UA_[UA_STATUSCODE])) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         return;
     }
     
     response->resultsSize = request->nodesToWriteSize;
     for(UA_Int32 i = 0;i < request->nodesToWriteSize;i++)
-        Service_Write_writeNode(server, &request->nodesToWrite[i], &response->results[i]);
+        response->results[i] = Service_Write_writeNode(server, &request->nodesToWrite[i]);
 }

+ 4 - 5
src/server/ua_services_monitoreditems.c

@@ -2,11 +2,11 @@
 #include "ua_namespace_0.h"
 #include "ua_statuscodes.h"
 
-UA_Int32 Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
-                                      const UA_CreateMonitoredItemsRequest *request,
-                                      UA_CreateMonitoredItemsResponse *response) {
+void Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
+                                  const UA_CreateMonitoredItemsRequest *request,
+                                  UA_CreateMonitoredItemsResponse *response) {
     if(request->itemsToCreateSize <= 0)
-        return UA_SUCCESS;
+        return;
 
     //mock up
     response->resultsSize = request->itemsToCreateSize;
@@ -24,5 +24,4 @@ UA_Int32 Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
             response->results[i].statusCode = -1;
         }
     }
-    return UA_SUCCESS;
 }

+ 13 - 13
src/server/ua_services_nodemanagement.c

@@ -29,11 +29,11 @@ static UA_StatusCode parseVariableNode(UA_ExtensionObject *attributes, UA_Node *
     UA_VariableAttributes attr;
     UA_UInt32 pos = 0;
     // todo return more informative error codes from decodeBinary
-    if(UA_VariableAttributes_decodeBinary(&attributes->body, &pos, &attr) != UA_SUCCESS)
+    if(UA_VariableAttributes_decodeBinary(&attributes->body, &pos, &attr) != UA_STATUSCODE_GOOD)
         return UA_STATUSCODE_BADNODEATTRIBUTESINVALID;
 
     UA_VariableNode *vnode;
-    if(UA_VariableNode_new(&vnode) != UA_SUCCESS) {
+    if(UA_VariableNode_new(&vnode) != UA_STATUSCODE_GOOD) {
         UA_VariableAttributes_deleteMembers(&attr);
         return UA_STATUSCODE_BADOUTOFMEMORY;
     }
@@ -94,13 +94,13 @@ UA_AddNodesResult AddNode(UA_Server *server, UA_Session *session, UA_Node **node
     UA_AddNodesResult_init(&result);
     
     const UA_Node *parent;
-    if(UA_NodeStore_get(server->nodestore, &parentNodeId->nodeId, &parent) != UA_SUCCESS) {
+    if(UA_NodeStore_get(server->nodestore, &parentNodeId->nodeId, &parent) != UA_STATUSCODE_GOOD) {
         result.statusCode = UA_STATUSCODE_BADPARENTNODEIDINVALID;
         return result;
     }
 
     const UA_ReferenceTypeNode *referenceType;
-    if(UA_NodeStore_get(server->nodestore, referenceTypeId, (const UA_Node**)&referenceType) != UA_SUCCESS) {
+    if(UA_NodeStore_get(server->nodestore, referenceTypeId, (const UA_Node**)&referenceType) != UA_STATUSCODE_GOOD) {
         result.statusCode = UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
         goto ret;
     }
@@ -119,18 +119,18 @@ UA_AddNodesResult AddNode(UA_Server *server, UA_Session *session, UA_Node **node
 
     if(UA_NodeId_isNull(&(*node)->nodeId)) {
         if(UA_NodeStore_insert(server->nodestore, node,
-                               UA_NODESTORE_INSERT_UNIQUE | UA_NODESTORE_INSERT_GETMANAGED) != UA_SUCCESS) {
+                               UA_NODESTORE_INSERT_UNIQUE | UA_NODESTORE_INSERT_GETMANAGED) != UA_STATUSCODE_GOOD) {
             result.statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
             goto ret2;
         }
         result.addedNodeId = (*node)->nodeId; // cannot fail as unique nodeids are numeric
     } else {
-        if(UA_NodeId_copy(&(*node)->nodeId, &result.addedNodeId) != UA_SUCCESS) {
+        if(UA_NodeId_copy(&(*node)->nodeId, &result.addedNodeId) != UA_STATUSCODE_GOOD) {
             result.statusCode = UA_STATUSCODE_BADOUTOFMEMORY;
             goto ret2;
         }
 
-        if(UA_NodeStore_insert(server->nodestore, node, UA_NODESTORE_INSERT_GETMANAGED) != UA_SUCCESS) {
+        if(UA_NodeStore_insert(server->nodestore, node, UA_NODESTORE_INSERT_GETMANAGED) != UA_STATUSCODE_GOOD) {
             result.statusCode = UA_STATUSCODE_BADNODEIDEXISTS;  // todo: differentiate out of memory
             UA_NodeId_deleteMembers(&result.addedNodeId);
             goto ret2;
@@ -190,7 +190,7 @@ void Service_AddNodes(UA_Server *server, UA_Session *session,
     }
 
     if(UA_Array_new((void **)&response->results, request->nodesToAddSize, &UA_[UA_ADDNODESRESULT])
-       != UA_SUCCESS) {
+       != UA_STATUSCODE_GOOD) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         return;
     }
@@ -212,7 +212,7 @@ static UA_Int32 AddSingleReference(UA_Node *node, UA_ReferenceNode *reference) {
         return UA_STATUSCODE_BADOUTOFMEMORY;
 
     UA_memcpy(new_refs, old_refs, sizeof(UA_ReferenceNode)*count);
-    if(UA_ReferenceNode_copy(reference, &new_refs[count]) != UA_SUCCESS) {
+    if(UA_ReferenceNode_copy(reference, &new_refs[count]) != UA_STATUSCODE_GOOD) {
         UA_free(new_refs);
         return UA_STATUSCODE_BADOUTOFMEMORY;
     }
@@ -220,19 +220,19 @@ static UA_Int32 AddSingleReference(UA_Node *node, UA_ReferenceNode *reference) {
     node->references     = new_refs;
     node->referencesSize = count+1;
     UA_free(old_refs);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 UA_Int32 AddReference(UA_NodeStore *nodestore, UA_Node *node, UA_ReferenceNode *reference) {
     UA_Int32 retval = AddSingleReference(node, reference);
     UA_Node *targetnode;
     UA_ReferenceNode inversereference;
-    if(retval != UA_SUCCESS || nodestore == UA_NULL)
+    if(retval != UA_STATUSCODE_GOOD || nodestore == UA_NULL)
         return retval;
 
     // Do a copy every time?
-    if(UA_NodeStore_get(nodestore, &reference->targetId.nodeId, (const UA_Node **)&targetnode) != UA_SUCCESS)
-        return UA_ERROR;
+    if(UA_NodeStore_get(nodestore, &reference->targetId.nodeId, (const UA_Node **)&targetnode) != UA_STATUSCODE_GOOD)
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     inversereference.referenceTypeId       = reference->referenceTypeId;
     inversereference.isInverse             = !reference->isInverse;

+ 2 - 1
src/server/ua_services_session.c

@@ -2,6 +2,7 @@
 #include "ua_server.h"
 #include "ua_session_manager.h"
 #include "ua_statuscodes.h"
+#include "ua_util.h"
 
 void Service_CreateSession(UA_Server *server, UA_SecureChannel *channel,
                            const UA_CreateSessionRequest *request,
@@ -52,7 +53,7 @@ void Service_CloseSession(UA_Server *server, const UA_CloseSessionRequest *reque
 	}
 
 
-	if(UA_SessionManager_removeSession(server->sessionManager, &foundSession->sessionId) == UA_SUCCESS){
+	if(UA_SessionManager_removeSession(server->sessionManager, &foundSession->sessionId) == UA_STATUSCODE_GOOD){
 		response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
 	}else{
 		//still not 100% sure about the return code

+ 36 - 49
src/server/ua_services_view.c

@@ -8,55 +8,43 @@ UA_Int32 Service_Browse_getReferenceDescription(UA_NodeStore *ns, UA_ReferenceNo
                                                 UA_UInt32 nodeClassMask, UA_UInt32 resultMask,
                                                 UA_ReferenceDescription *referenceDescription) {
     const UA_Node *foundNode;
-    if(UA_NodeStore_get(ns, &reference->targetId.nodeId, &foundNode) != UA_SUCCESS)
-        return UA_ERROR;
+    if(UA_NodeStore_get(ns, &reference->targetId.nodeId, &foundNode) != UA_STATUSCODE_GOOD)
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     UA_NodeId_copy(&foundNode->nodeId, &referenceDescription->nodeId.nodeId);
     //TODO ExpandedNodeId is a mockup
     referenceDescription->nodeId.serverIndex = 0;
     referenceDescription->nodeId.namespaceUri.length = -1;
 
-    UA_UInt32 mask = 0;
-    for(mask = 0x01;mask <= 0x40;mask *= 2) {
-        switch(mask & (resultMask)) {
-        case UA_BROWSERESULTMASK_REFERENCETYPEID:
-            UA_NodeId_copy(&reference->referenceTypeId, &referenceDescription->referenceTypeId);
-            break;
-
-        case UA_BROWSERESULTMASK_ISFORWARD:
-            referenceDescription->isForward = !reference->isInverse;
-            break;
-
-        case UA_BROWSERESULTMASK_NODECLASS:
-            UA_NodeClass_copy(&foundNode->nodeClass, &referenceDescription->nodeClass);
-            break;
-
-        case UA_BROWSERESULTMASK_BROWSENAME:
-            UA_QualifiedName_copy(&foundNode->browseName, &referenceDescription->browseName);
-            break;
-
-        case UA_BROWSERESULTMASK_DISPLAYNAME:
-            UA_LocalizedText_copy(&foundNode->displayName, &referenceDescription->displayName);
-            break;
-
-        case UA_BROWSERESULTMASK_TYPEDEFINITION:
-            if(foundNode->nodeClass != UA_NODECLASS_OBJECT &&
-               foundNode->nodeClass != UA_NODECLASS_VARIABLE)
-                break;
-
-            for(UA_Int32 i = 0;i < foundNode->referencesSize;i++) {
-                UA_ReferenceNode *ref = &foundNode->references[i];
-                if(ref->referenceTypeId.identifier.numeric == 40 /* hastypedefinition */) {
-                    UA_ExpandedNodeId_copy(&ref->targetId, &referenceDescription->typeDefinition);
-                    break;
-                }
+    /* UA_UInt32 mask = 0; */
+    /* for(mask = 0x01;mask <= 0x40;mask *= 2) { */
+    /*     switch(mask & (resultMask)) { */
+    if(resultMask & UA_BROWSERESULTMASK_REFERENCETYPEID)
+        UA_NodeId_copy(&reference->referenceTypeId, &referenceDescription->referenceTypeId);
+    if(resultMask & UA_BROWSERESULTMASK_ISFORWARD)
+        referenceDescription->isForward = !reference->isInverse;
+    if(resultMask & UA_BROWSERESULTMASK_NODECLASS)
+        UA_NodeClass_copy(&foundNode->nodeClass, &referenceDescription->nodeClass);
+    if(resultMask & UA_BROWSERESULTMASK_BROWSENAME)
+        UA_QualifiedName_copy(&foundNode->browseName, &referenceDescription->browseName);
+    if(resultMask & UA_BROWSERESULTMASK_DISPLAYNAME)
+        UA_LocalizedText_copy(&foundNode->displayName, &referenceDescription->displayName);
+    if(resultMask & UA_BROWSERESULTMASK_TYPEDEFINITION) {
+        if(foundNode->nodeClass != UA_NODECLASS_OBJECT &&
+           foundNode->nodeClass != UA_NODECLASS_VARIABLE)
+            goto end;
+        
+        for(UA_Int32 i = 0;i < foundNode->referencesSize;i++) {
+            UA_ReferenceNode *ref = &foundNode->references[i];
+            if(ref->referenceTypeId.identifier.numeric == 40 /* hastypedefinition */) {
+                UA_ExpandedNodeId_copy(&ref->targetId, &referenceDescription->typeDefinition);
+                goto end;
             }
-            break;
         }
     }
-
+ end:
     UA_NodeStore_releaseManagedNode(foundNode);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 /* singly-linked list */
@@ -80,7 +68,7 @@ static UA_UInt32 walkReferenceTree(UA_NodeStore *ns, const UA_ReferenceTypeNode
         if(current->references[i].referenceTypeId.identifier.numeric == 45 /* HasSubtype */ &&
            current->references[i].isInverse == UA_FALSE) {
             const UA_Node *node;
-            if(UA_NodeStore_get(ns, &current->references[i].targetId.nodeId, &node) == UA_SUCCESS
+            if(UA_NodeStore_get(ns, &current->references[i].targetId.nodeId, &node) == UA_STATUSCODE_GOOD
                && node->nodeClass == UA_NODECLASS_REFERENCETYPE) {
                 count += walkReferenceTree(ns, (UA_ReferenceTypeNode *)node, list);
                 UA_NodeStore_releaseManagedNode(node);
@@ -99,9 +87,9 @@ static UA_Int32 findSubReferenceTypes(UA_NodeStore *ns, UA_NodeId *rootReference
 
     // walk the tree
     const UA_ReferenceTypeNode *root;
-    if(UA_NodeStore_get(ns, rootReferenceType, (const UA_Node **)&root) != UA_SUCCESS ||
+    if(UA_NodeStore_get(ns, rootReferenceType, (const UA_Node **)&root) != UA_STATUSCODE_GOOD ||
        root->nodeClass != UA_NODECLASS_REFERENCETYPE)
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
     count = walkReferenceTree(ns, root, &list);
     UA_NodeStore_releaseManagedNode((const UA_Node *)root);
 
@@ -115,7 +103,7 @@ static UA_Int32 findSubReferenceTypes(UA_NodeStore *ns, UA_NodeId *rootReference
     }
     *idcount = count;
 
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 /* is this a relevant reference? */
@@ -144,7 +132,7 @@ static void Service_Browse_getBrowseResult(UA_NodeStore         *ns,
     const UA_Node *node;
     UA_NodeId     *relevantReferenceTypes = UA_NULL;
     UA_UInt32      relevantReferenceTypesCount = 0;
-    if(UA_NodeStore_get(ns, &browseDescription->nodeId, &node) != UA_SUCCESS) {
+    if(UA_NodeStore_get(ns, &browseDescription->nodeId, &node) != UA_STATUSCODE_GOOD) {
         browseResult->statusCode = UA_STATUSCODE_BADNODEIDUNKNOWN;
         return;
     }
@@ -156,7 +144,7 @@ static void Service_Browse_getBrowseResult(UA_NodeStore         *ns,
     // discover the relevant subtypes
     if(!browseDescription->includeSubtypes ||
        findSubReferenceTypes(ns, &browseDescription->referenceTypeId, &relevantReferenceTypes,
-                             &relevantReferenceTypesCount) != UA_SUCCESS) {
+                             &relevantReferenceTypesCount) != UA_STATUSCODE_GOOD) {
         if(!(relevantReferenceTypes = UA_alloc(sizeof(UA_NodeId)))) {
             return;
         }
@@ -192,8 +180,7 @@ static void Service_Browse_getBrowseResult(UA_NodeStore         *ns,
             continue;
 
         if(Service_Browse_getReferenceDescription(ns, &node->references[i], browseDescription->nodeClassMask,
-                                                  browseDescription->resultMask,
-                                                  &browseResult->references[j]) != UA_SUCCESS)
+                                                  browseDescription->resultMask, &browseResult->references[j]) != UA_STATUSCODE_GOOD)
             browseResult->statusCode = UA_STATUSCODE_UNCERTAINNOTALLNODESAVAILABLE;
         j++;
     }
@@ -216,7 +203,7 @@ void Service_Browse(UA_Server *server, UA_Session *session,
     }
 
     if(UA_Array_new((void **)&(response->results), request->nodesToBrowseSize, &UA_[UA_BROWSERESULT])
-       != UA_SUCCESS) {
+       != UA_STATUSCODE_GOOD) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         return;
     }
@@ -242,7 +229,7 @@ void Service_TranslateBrowsePathsToNodeIds(UA_Server *server, UA_Session *sessio
     response->resultsSize = request->browsePathsSize;
     // _init of the elements is done in Array_new
     if(UA_Array_new((void **)&response->results, request->browsePathsSize, &UA_[UA_BROWSEPATHRESULT])
-       != UA_SUCCESS) {
+       != UA_STATUSCODE_GOOD) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
         return;
     }

+ 15 - 17
src/server/ua_session_manager.c

@@ -22,9 +22,8 @@ struct UA_SessionManager {
     UA_DateTime  sessionTimeout;
 };
 
-UA_Int32 UA_SessionManager_new(UA_SessionManager **sessionManager, UA_UInt32 maxSessionCount,
-                               UA_UInt32 sessionTimeout, UA_UInt32 startSessionId) {
-    UA_Int32 retval = UA_SUCCESS;
+UA_StatusCode UA_SessionManager_new(UA_SessionManager **sessionManager, UA_UInt32 maxSessionCount,
+                                    UA_UInt32 sessionTimeout, UA_UInt32 startSessionId) {
     if(!(*sessionManager = UA_alloc(sizeof(UA_SessionManager))))
         return UA_STATUSCODE_BADOUTOFMEMORY;
     LIST_INIT(&(*sessionManager)->sessions);
@@ -32,10 +31,10 @@ UA_Int32 UA_SessionManager_new(UA_SessionManager **sessionManager, UA_UInt32 max
     (*sessionManager)->lastSessionId   = startSessionId;
     (*sessionManager)->sessionTimeout  = sessionTimeout;
     (*sessionManager)->currentSessionCount = 0;
-    return retval;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_SessionManager_delete(UA_SessionManager *sessionManager) {
+void UA_SessionManager_delete(UA_SessionManager *sessionManager) {
     struct session_list_entry *current = LIST_FIRST(&sessionManager->sessions);
     while(current) {
         LIST_REMOVE(current, pointers);
@@ -46,13 +45,12 @@ UA_Int32 UA_SessionManager_delete(UA_SessionManager *sessionManager) {
         current = LIST_FIRST(&sessionManager->sessions);
     }
     UA_free(sessionManager);
-    return UA_SUCCESS;
 }
 
-UA_Int32 UA_SessionManager_getSessionById(UA_SessionManager *sessionManager, UA_NodeId *sessionId, UA_Session **session) {
+UA_StatusCode UA_SessionManager_getSessionById(UA_SessionManager *sessionManager, UA_NodeId *sessionId, UA_Session **session) {
     if(sessionManager == UA_NULL) {
         *session = UA_NULL;
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
     }
 
     struct session_list_entry *current = UA_NULL;
@@ -63,19 +61,19 @@ UA_Int32 UA_SessionManager_getSessionById(UA_SessionManager *sessionManager, UA_
 
     if(!current) {
         *session = UA_NULL;
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
     }
 
     // Lifetime handling is not done here, but in a regular cleanup by the
     // server. If the session still exists, then it is valid.
     *session = &current->session;
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_SessionManager_getSessionByToken(UA_SessionManager *sessionManager, UA_NodeId *token, UA_Session **session) {
+UA_StatusCode UA_SessionManager_getSessionByToken(UA_SessionManager *sessionManager, UA_NodeId *token, UA_Session **session) {
     if(sessionManager == UA_NULL) {
         *session = UA_NULL;
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
     }
 
     struct session_list_entry *current = UA_NULL;
@@ -86,13 +84,13 @@ UA_Int32 UA_SessionManager_getSessionByToken(UA_SessionManager *sessionManager,
 
     if(!current) {
         *session = UA_NULL;
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
     }
 
     // Lifetime handling is not done here, but in a regular cleanup by the
     // server. If the session still exists, then it is valid.
     *session = &current->session;
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 /** Creates and adds a session. */
@@ -121,7 +119,7 @@ UA_StatusCode UA_SessionManager_createSession(UA_SessionManager *sessionManager,
     return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_SessionManager_removeSession(UA_SessionManager *sessionManager, UA_NodeId  *sessionId) {
+UA_StatusCode UA_SessionManager_removeSession(UA_SessionManager *sessionManager, UA_NodeId  *sessionId) {
     struct session_list_entry *current = UA_NULL;
     LIST_FOREACH(current, &sessionManager->sessions, pointers) {
         if(UA_NodeId_equal(&current->session.sessionId, sessionId) == UA_EQUAL)
@@ -129,12 +127,12 @@ UA_Int32 UA_SessionManager_removeSession(UA_SessionManager *sessionManager, UA_N
     }
 
     if(!current)
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     LIST_REMOVE(current, pointers);
     if(current->session.channel)
         current->session.channel->session = UA_NULL; // the channel is no longer attached to a session
     UA_Session_deleteMembers(&current->session);
     UA_free(current);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }

+ 9 - 9
src/server/ua_session_manager.h

@@ -4,16 +4,16 @@
 #include "ua_server.h"
 #include "ua_session.h"
 
-UA_Int32 UA_SessionManager_new(UA_SessionManager **sessionManager, UA_UInt32 maxSessionCount,
-                               UA_UInt32 sessionLifetime, UA_UInt32 startSessionId);
+UA_StatusCode UA_SessionManager_new(UA_SessionManager **sessionManager, UA_UInt32 maxSessionCount,
+                                    UA_UInt32 sessionLifetime, UA_UInt32 startSessionId);
 
-UA_Int32 UA_SessionManager_delete(UA_SessionManager *sessionManager);
+void UA_SessionManager_delete(UA_SessionManager *sessionManager);
 
 UA_StatusCode UA_SessionManager_createSession(UA_SessionManager *sessionManager,
                                               UA_SecureChannel *channel, UA_Session **session);
 
-UA_Int32 UA_SessionManager_removeSession(UA_SessionManager *sessionManager,
-                                         UA_NodeId         *sessionId);
+UA_StatusCode UA_SessionManager_removeSession(UA_SessionManager *sessionManager,
+                                              UA_NodeId         *sessionId);
 
 /**
  * @brief finds the session which is identified by the sessionId
@@ -21,16 +21,16 @@ UA_Int32 UA_SessionManager_removeSession(UA_SessionManager *sessionManager,
  * @param session the session object is returned if no error occurs
  * @return error code
  */
-UA_Int32 UA_SessionManager_getSessionById(UA_SessionManager *sessionManager,
-                                          UA_NodeId *sessionId, UA_Session **session);
+UA_StatusCode UA_SessionManager_getSessionById(UA_SessionManager *sessionManager,
+                                               UA_NodeId *sessionId, UA_Session **session);
 
 /**
  * @param token authentication token which is used to get the session object
  * @param session output, session object which is identified by the authentication token
  * @return error code
  */
-UA_Int32 UA_SessionManager_getSessionByToken(UA_SessionManager *sessionManager,
-                                             UA_NodeId *token, UA_Session **session);
+UA_StatusCode UA_SessionManager_getSessionByToken(UA_SessionManager *sessionManager,
+                                                  UA_NodeId *token, UA_Session **session);
 
 //UA_Int32 UA_SessionManager_updateSessions();
 //UA_Int32 UA_SessionManager_generateToken(UA_Session session, UA_Int32 requestedLifeTime, SecurityTokenRequestType requestType, UA_ChannelSecurityToken* newToken);

+ 4 - 5
src/ua_connection.c

@@ -5,18 +5,17 @@ UA_ConnectionConfig UA_ConnectionConfig_standard = { .protocolVersion = 0,    .s
                                                      .recvBufferSize  = 65536, .maxMessageSize = 65536,
                                                      .maxChunkCount   = 1 };
 
-UA_Int32 UA_Connection_init(UA_Connection *connection, UA_ConnectionConfig localConf, void *callbackHandle,
-                            UA_Connection_closeCallback close, UA_Connection_writeCallback write) {
+UA_StatusCode UA_Connection_init(UA_Connection *connection, UA_ConnectionConfig localConf, void *callbackHandle,
+                                 UA_Connection_closeCallback close, UA_Connection_writeCallback write) {
     connection->state          = UA_CONNECTION_OPENING;
     connection->localConf      = localConf;
     connection->channel        = UA_NULL;
     connection->callbackHandle = callbackHandle;
     connection->close          = close;
     connection->write          = write;
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_Connection_deleteMembers(UA_Connection *connection) {
+void UA_Connection_deleteMembers(UA_Connection *connection) {
     UA_free(connection->callbackHandle);
-    return UA_SUCCESS;
 }

+ 12 - 16
src/ua_securechannel.c

@@ -32,30 +32,26 @@ UA_Boolean UA_SecureChannel_compare(UA_SecureChannel *sc1, UA_SecureChannel *sc2
 }
 
 //TODO implement real nonce generator - DUMMY function
-UA_Int32 UA_SecureChannel_generateNonce(UA_ByteString *nonce) {
+UA_StatusCode UA_SecureChannel_generateNonce(UA_ByteString *nonce) {
     if(!(nonce->data = UA_alloc(1)))
         return UA_STATUSCODE_BADOUTOFMEMORY;
     nonce->length  = 1;
     nonce->data[0] = 'a';
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_SecureChannel_updateRequestId(UA_SecureChannel *channel, UA_UInt32 requestId) {
+UA_StatusCode UA_SecureChannel_updateRequestId(UA_SecureChannel *channel, UA_UInt32 requestId) {
     //TODO review checking of request id
-    if(channel->requestId+1  == requestId) {
-        channel->requestId++;
-        return UA_SUCCESS;
-    }
-    return UA_ERROR;
+    if(channel->requestId+1 != requestId)
+        return UA_STATUSCODE_BADINTERNALERROR;
+    channel->requestId++;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_SecureChannel_updateSequenceNumber(UA_SecureChannel *channel,
-                                               UA_UInt32         sequenceNumber) {
+UA_Int32 UA_SecureChannel_updateSequenceNumber(UA_SecureChannel *channel, UA_UInt32 sequenceNumber) {
     //TODO review checking of sequence
-    if(channel->sequenceNumber+1  == sequenceNumber) {
-        channel->sequenceNumber++;
-        return UA_SUCCESS;
-    }
-    return UA_ERROR;
-
+    if(channel->sequenceNumber+1  != sequenceNumber)
+        return UA_STATUSCODE_BADINTERNALERROR;
+    channel->sequenceNumber++;
+    return UA_STATUSCODE_GOOD;
 }

+ 1 - 1
src/ua_securechannel.h

@@ -33,7 +33,7 @@ void UA_SecureChannel_deleteMembers(UA_SecureChannel *channel);
 void UA_SecureChannel_delete(UA_SecureChannel *channel);
 UA_Boolean UA_SecureChannel_compare(UA_SecureChannel *sc1, UA_SecureChannel *sc2);
 
-UA_Int32 UA_SecureChannel_generateNonce(UA_ByteString *nonce);
+UA_StatusCode UA_SecureChannel_generateNonce(UA_ByteString *nonce);
 UA_Int32 UA_SecureChannel_updateRequestId(UA_SecureChannel *channel, UA_UInt32 requestId);
 UA_Int32 UA_SecureChannel_updateSequenceNumber(UA_SecureChannel *channel, UA_UInt32 sequenceNumber);
 

+ 11 - 14
src/ua_session.c

@@ -41,23 +41,20 @@ UA_Session adminSession = {
     .validTill = UA_INT64_MAX,
     .channel = UA_NULL};
 
-UA_Int32 UA_Session_new(UA_Session **session) {
+UA_StatusCode UA_Session_new(UA_Session **session) {
     if(!(*session = UA_alloc(sizeof(UA_Session))))
         return UA_STATUSCODE_BADOUTOFMEMORY;
     UA_Session_init(*session);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 /* mock up function to generate tokens for authentication */
-UA_Int32 UA_Session_generateToken(UA_NodeId *newToken) {
+UA_StatusCode UA_Session_generateToken(UA_NodeId *newToken) {
     //Random token generation
-    UA_Int32 retval = UA_SUCCESS;
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
     srand(time(NULL));
 
-    UA_Int32 i = 0;
-    UA_Int32 r = 0;
-    //retval |= UA_NodeId_new(newToken);
-
+    UA_Int32 i, r = 0;
     newToken->namespaceIndex = 0; // where else?
     newToken->identifierType = UA_NODEIDTYPE_GUID;
     newToken->identifier.guid.data1 = rand();
@@ -108,18 +105,18 @@ UA_Boolean UA_Session_compare(UA_Session *session1, UA_Session *session2) {
     return UA_FALSE;
 }
 
-UA_Int32 UA_Session_setExpirationDate(UA_Session *session) {
+UA_StatusCode UA_Session_setExpirationDate(UA_Session *session) {
     if(!session)
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     session->validTill = UA_DateTime_now() + session->timeout * 100000; //timeout in ms
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_Int32 UA_Session_getPendingLifetime(UA_Session *session, UA_Double *pendingLifetime_ms) {
+UA_StatusCode UA_Session_getPendingLifetime(UA_Session *session, UA_Double *pendingLifetime_ms) {
     if(!session)
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     *pendingLifetime_ms = (session->validTill - UA_DateTime_now())/10000000; //difference in ms
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }

+ 4 - 4
src/ua_session.h

@@ -25,7 +25,7 @@ struct UA_Session {
 extern UA_Session anonymousSession; ///< If anonymous access is allowed, this session is used internally (Session ID: 0)
 extern UA_Session adminSession; ///< Local access to the services (for startup and maintenance) uses this Session with all possible access rights (Session ID: 1)
 
-UA_Int32 UA_Session_new(UA_Session **session);
+UA_StatusCode UA_Session_new(UA_Session **session);
 void UA_Session_init(UA_Session *session);
 void UA_Session_delete(UA_Session *session);
 void UA_Session_deleteMembers(UA_Session *session);
@@ -34,10 +34,10 @@ void UA_Session_deleteMembers(UA_Session *session);
 UA_Boolean UA_Session_compare(UA_Session *session1, UA_Session *session2);
 
 /** If any activity on a session happens, the timeout must be extended */
-UA_Int32 UA_Session_updateLifetime(UA_Session *session);
+UA_StatusCode UA_Session_updateLifetime(UA_Session *session);
 /** Set up the point in time till the session is valid */
-UA_Int32 UA_Session_setExpirationDate(UA_Session *session);
+UA_StatusCode UA_Session_setExpirationDate(UA_Session *session);
 /** Gets the sessions pending lifetime (calculated from the timeout which was set) */
-UA_Int32 UA_Session_getPendingLifetime(UA_Session *session, UA_Double *pendingLifetime);
+UA_StatusCode UA_Session_getPendingLifetime(UA_Session *session, UA_Double *pendingLifetime);
 
 #endif /* UA_SESSION_H_ */

+ 12 - 13
src/ua_transport.c

@@ -5,33 +5,32 @@
 #include "ua_util.h"
 
 UA_TYPE_DEFAULT(UA_MessageType)
-UA_Int32 UA_MessageType_calcSizeBinary(UA_MessageType const *ptr) {
-    if(ptr == UA_NULL) return sizeof(UA_MessageType);
+UA_UInt32 UA_MessageType_calcSizeBinary(UA_MessageType const *ptr) {
     return 3 * sizeof(UA_Byte);
 }
 
-UA_Int32 UA_MessageType_encodeBinary(UA_MessageType const *src, UA_ByteString *dst, UA_UInt32 *offset) {
-    UA_Int32 retval = UA_SUCCESS;
-    UA_Byte  tmpBuf[3];
+UA_StatusCode UA_MessageType_encodeBinary(UA_MessageType const *src, UA_ByteString *dst, UA_UInt32 *offset) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    UA_Byte tmpBuf[3];
     tmpBuf[0] = (UA_Byte)((((UA_Int32)*src) >> 16) );
     tmpBuf[1] = (UA_Byte)((((UA_Int32)*src) >> 8));
     tmpBuf[2] = (UA_Byte)(((UA_Int32)*src));
 
-    retval   |= UA_Byte_encodeBinary(&(tmpBuf[0]), dst, offset);
-    retval   |= UA_Byte_encodeBinary(&(tmpBuf[1]), dst, offset);
-    retval   |= UA_Byte_encodeBinary(&(tmpBuf[2]), dst, offset);
+    retval |= UA_Byte_encodeBinary(&(tmpBuf[0]), dst, offset);
+    retval |= UA_Byte_encodeBinary(&(tmpBuf[1]), dst, offset);
+    retval |= UA_Byte_encodeBinary(&(tmpBuf[2]), dst, offset);
     return retval;
 }
 
-UA_Int32 UA_MessageType_decodeBinary(UA_ByteString const *src, UA_UInt32 *offset, UA_MessageType *dst) {
+UA_StatusCode UA_MessageType_decodeBinary(UA_ByteString const *src, UA_UInt32 *offset, UA_MessageType *dst) {
     if(*offset+3 > (UA_UInt32)src->length)
-        return UA_ERROR;
-    UA_Int32 retval = UA_SUCCESS;
-    UA_Byte  tmpBuf[3];
+        return UA_STATUSCODE_BADDECODINGERROR;
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    UA_Byte tmpBuf[3];
     retval |= UA_Byte_decodeBinary(src, offset, &(tmpBuf[0])); //messageType to Byte representation
     retval |= UA_Byte_decodeBinary(src, offset, &(tmpBuf[1]));
     retval |= UA_Byte_decodeBinary(src, offset, &(tmpBuf[2]));
-    *dst    = (UA_MessageType)((UA_Int32)(tmpBuf[0]<<16) + (UA_Int32)(tmpBuf[1]<<8) + (UA_Int32)(tmpBuf[2]));
+    *dst = (UA_MessageType)((UA_Int32)(tmpBuf[0]<<16) + (UA_Int32)(tmpBuf[1]<<8) + (UA_Int32)(tmpBuf[2]));
     return retval;
 }
 

+ 168 - 142
src/ua_types.c

@@ -29,7 +29,7 @@ UA_TYPE_NEW_DEFAULT(UA_Boolean)
 UA_TYPE_COPY_DEFAULT(UA_Boolean)
 #ifdef DEBUG
 void UA_Boolean_print(const UA_Boolean *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     if(*p) fprintf(stream, "UA_TRUE");
     else fprintf(stream, "UA_FALSE");
 }
@@ -39,7 +39,7 @@ void UA_Boolean_print(const UA_Boolean *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_SByte)
 #ifdef DEBUG
 void UA_SByte_print(const UA_SByte *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     UA_SByte x = *p;
     fprintf(stream, "%s%x\n", x < 0 ? "-" : "", x < 0 ? -x : x);
 }
@@ -49,7 +49,7 @@ void UA_SByte_print(const UA_SByte *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_Byte)
 #ifdef DEBUG
 void UA_Byte_print(const UA_Byte *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%x", *p);
 }
 #endif
@@ -58,7 +58,7 @@ void UA_Byte_print(const UA_Byte *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_Int16)
 #ifdef DEBUG
 void UA_Int16_print(const UA_Int16 *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%d", *p);
 }
 #endif
@@ -67,7 +67,7 @@ void UA_Int16_print(const UA_Int16 *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_UInt16)
 #ifdef DEBUG
 void UA_UInt16_print(const UA_UInt16 *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%u", *p);
 }
 #endif
@@ -76,7 +76,7 @@ void UA_UInt16_print(const UA_UInt16 *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_Int32)
 #ifdef DEBUG
 void UA_Int32_print(const UA_Int32 *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%d", *p);
 }
 
@@ -86,7 +86,7 @@ void UA_Int32_print(const UA_Int32 *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_UInt32)
 #ifdef DEBUG
 void UA_UInt32_print(const UA_UInt32 *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%u", *p);
 }
 #endif
@@ -95,7 +95,7 @@ void UA_UInt32_print(const UA_UInt32 *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_Int64)
 #ifdef DEBUG
 void UA_Int64_print(const UA_Int64 *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%" PRIi64, *p);
 }
 #endif
@@ -104,7 +104,7 @@ void UA_Int64_print(const UA_Int64 *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_UInt64)
 #ifdef DEBUG
 void UA_UInt64_print(const UA_UInt64 *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%" PRIu64, *p);
 }
 #endif
@@ -113,7 +113,7 @@ void UA_UInt64_print(const UA_UInt64 *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_Float)
 #ifdef DEBUG
 void UA_Float_print(const UA_Float *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%f", *p);
 }
 #endif
@@ -122,7 +122,7 @@ void UA_Float_print(const UA_Float *p, FILE *stream) {
 UA_TYPE_DEFAULT(UA_Double)
 #ifdef DEBUG
 void UA_Double_print(const UA_Double *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "%f", *p);
 }
 #endif
@@ -137,28 +137,30 @@ void UA_String_init(UA_String *p) {
 
 UA_TYPE_DELETE_DEFAULT(UA_String)
 void UA_String_deleteMembers(UA_String *p) {
-    if(p && p->length > 0 && p->data != UA_NULL) {
+    if(p->data != UA_NULL) {
         UA_free(p->data);
         UA_String_init(p);
     }
 }
 
-UA_Int32 UA_String_copy(UA_String const *src, UA_String *dst) {
-    if(!src || !dst) return UA_ERROR;
+UA_StatusCode UA_String_copy(UA_String const *src, UA_String *dst) {
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
     if(src->length > 0) {
         if(!(dst->data = UA_alloc(src->length)))
             return UA_STATUSCODE_BADOUTOFMEMORY;
         UA_memcpy((void *)dst->data, src->data, src->length);
     }
     dst->length = src->length;
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 #ifdef DEBUG
 void UA_String_print(const UA_String *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream)
+        return;
     fprintf(stream, "(UA_String){%d,", p->length);
-    if(p->data != UA_NULL)
+    if(p->data)
         fprintf(stream, "\"%.*s\"}", p->length, p->data);
     else
         fprintf(stream, "UA_NULL}");
@@ -173,15 +175,15 @@ UA_Int32 UA_String_copycstring(char const *src, UA_String *dst) {
             return UA_STATUSCODE_BADOUTOFMEMORY;
         UA_memcpy((void *)dst->data, src, dst->length);
     }
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 #define UA_STRING_COPYPRINTF_BUFSIZE 1024
-UA_Int32 UA_String_copyprintf(char const *fmt, UA_String *dst, ...) {
-    UA_Int32 retval = UA_SUCCESS;
-    char     src[UA_STRING_COPYPRINTF_BUFSIZE];
-    UA_Int32 len;
-    va_list  ap;
+UA_StatusCode UA_String_copyprintf(char const *fmt, UA_String *dst, ...) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    char          src[UA_STRING_COPYPRINTF_BUFSIZE];
+    UA_Int32      len;
+    va_list       ap;
     va_start(ap, dst);
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
@@ -192,7 +194,7 @@ UA_Int32 UA_String_copyprintf(char const *fmt, UA_String *dst, ...) {
     if(len < 0) {  // FIXME: old glibc 2.0 would return -1 when truncated
         dst->length = 0;
         dst->data   = UA_NULL;
-        retval      = UA_ERR_INVALID_VALUE;
+        retval      = UA_STATUSCODE_BADINTERNALERROR;
     } else {
         // since glibc 2.1 vsnprintf returns len that would have resulted if buf were large enough
         dst->length = ( len > UA_STRING_COPYPRINTF_BUFSIZE ? UA_STRING_COPYPRINTF_BUFSIZE : len );
@@ -224,8 +226,9 @@ void UA_String_printf(char const *label, const UA_String *string) {
 
 #ifdef DEBUG
 void UA_String_printx(char const *label, const UA_String *string) {
-    if(string == UA_NULL) {
-        printf("%s {NULL}\n", label); return;
+    if(!string) {
+        printf("%s {NULL}\n", label);
+        return;
     }
     printf("%s {Length=%d, Data=", label, string->length);
     if(string->length > 0) {
@@ -312,7 +315,7 @@ UA_DateTimeStruct UA_DateTime_toStruct(UA_DateTime time) {
     return dateTimeStruct;
 }
 
-UA_Int32 UA_DateTime_toString(UA_DateTime time, UA_String *timeString) {
+UA_StatusCode UA_DateTime_toString(UA_DateTime time, UA_String *timeString) {
     // length of the string is 31 (incl. \0 at the end)
     if(!(timeString->data = UA_alloc(31)))
         return UA_STATUSCODE_BADOUTOFMEMORY;
@@ -321,7 +324,7 @@ UA_Int32 UA_DateTime_toString(UA_DateTime time, UA_String *timeString) {
     UA_DateTimeStruct tSt = UA_DateTime_toStruct(time);
     sprintf((char*)timeString->data, "%2d/%2d/%4d %2d:%2d:%2d.%3d.%3d.%3d", tSt.mounth, tSt.day, tSt.year,
             tSt.hour, tSt.min, tSt.sec, tSt.milliSec, tSt.microSec, tSt.nanoSec);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 /* Guid */
@@ -343,17 +346,17 @@ void UA_Guid_init(UA_Guid *p) {
 }
 
 UA_TYPE_NEW_DEFAULT(UA_Guid)
-UA_Int32 UA_Guid_copy(UA_Guid const *src, UA_Guid *dst) {
-    if(src == UA_NULL || dst == UA_NULL) return UA_ERROR;
+UA_StatusCode UA_Guid_copy(UA_Guid const *src, UA_Guid *dst) {
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
     UA_memcpy((void *)dst, (void *)src, sizeof(UA_Guid));
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 #ifdef DEBUG
 void UA_Guid_print(const UA_Guid *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
-    fprintf(stream, "(UA_Guid){%u, %u %u {%x,%x,%x,%x,%x,%x,%x,%x}}", p->data1, p->data2, p->data3,
-            p->data4[0],
+    if(!p || !stream) return;
+    fprintf(stream, "(UA_Guid){%u, %u %u {%x,%x,%x,%x,%x,%x,%x,%x}}", p->data1, p->data2, p->data3, p->data4[0],
             p->data4[1], p->data4[2], p->data4[3], p->data4[4], p->data4[5], p->data4[6], p->data4[7]);
 }
 #endif
@@ -387,8 +390,8 @@ UA_Byte       UA_Byte_securityPoliceNoneData[] = "http://opcfoundation.org/UA/Se
 UA_ByteString UA_ByteString_securityPoliceNone =
 { sizeof(UA_Byte_securityPoliceNoneData)-1, UA_Byte_securityPoliceNoneData };
 
-UA_Int32 UA_ByteString_newMembers(UA_ByteString *p, UA_Int32 length) {
-    UA_Int32 retval = UA_SUCCESS;
+UA_StatusCode UA_ByteString_newMembers(UA_ByteString *p, UA_Int32 length) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
     if(length > 0) {
         if((p->data = UA_alloc(length))) {
             p->length = length;
@@ -396,7 +399,8 @@ UA_Int32 UA_ByteString_newMembers(UA_ByteString *p, UA_Int32 length) {
         }
         retval = UA_STATUSCODE_BADOUTOFMEMORY;
     }
-    p->length = -1;
+    if(length < 0)
+        p->length = -1;
     p->data   = UA_NULL;
     return retval;
 }
@@ -413,15 +417,15 @@ void UA_NodeId_init(UA_NodeId *p) {
 }
 
 UA_TYPE_NEW_DEFAULT(UA_NodeId)
-UA_Int32 UA_NodeId_copy(UA_NodeId const *src, UA_NodeId *dst) {
-    UA_Int32 retval = UA_SUCCESS;
-    if(src == UA_NULL || dst == UA_NULL)
-        return UA_ERROR;
+UA_StatusCode UA_NodeId_copy(UA_NodeId const *src, UA_NodeId *dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     switch(src->identifierType) {
     case UA_NODEIDTYPE_NUMERIC:
         *dst = *src;
-        return UA_SUCCESS;
+        return UA_STATUSCODE_GOOD;
         break;
 
     case UA_NODEIDTYPE_STRING: // Table 6, second entry
@@ -470,8 +474,7 @@ void UA_NodeId_deleteMembers(UA_NodeId *p) {
 
 #ifdef DEBUG
 void UA_NodeId_print(const UA_NodeId *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL)
-        return;
+    if(!p || !stream) return;
 
     fprintf(stream, "(UA_NodeId){");
     switch(p->identifierType) {
@@ -524,7 +527,7 @@ void UA_NodeId_print(const UA_NodeId *p, FILE *stream) {
 #endif
 
 UA_EQUALITY UA_NodeId_equal(const UA_NodeId *n1, const UA_NodeId *n2) {
-    if(n1 == UA_NULL || n2 == UA_NULL || n1->namespaceIndex != n2->namespaceIndex)
+    if(!n1 || !n2 || n1->namespaceIndex != n2->namespaceIndex)
         return UA_NOT_EQUAL;
 
     switch(n1->identifierType) {
@@ -549,20 +552,24 @@ UA_EQUALITY UA_NodeId_equal(const UA_NodeId *n1, const UA_NodeId *n2) {
 UA_Boolean UA_NodeId_isNull(const UA_NodeId *p) {
     switch(p->identifierType) {
     case UA_NODEIDTYPE_NUMERIC:
-        if(p->namespaceIndex != 0 || p->identifier.numeric != 0) return UA_FALSE;
+        if(p->namespaceIndex != 0 || p->identifier.numeric != 0)
+            return UA_FALSE;
         break;
 
     case UA_NODEIDTYPE_STRING:
-        if(p->namespaceIndex != 0 || p->identifier.string.length != 0) return UA_FALSE;
+        if(p->namespaceIndex != 0 || p->identifier.string.length != 0)
+            return UA_FALSE;
         break;
 
     case UA_NODEIDTYPE_GUID:
         if(p->namespaceIndex != 0 ||
-           memcmp(&p->identifier.guid, (char[sizeof(UA_Guid)]) { 0 }, sizeof(UA_Guid)) != 0) return UA_FALSE;
+           memcmp(&p->identifier.guid, (char[sizeof(UA_Guid)]) { 0 }, sizeof(UA_Guid)) != 0)
+            return UA_FALSE;
         break;
 
     case UA_NODEIDTYPE_BYTESTRING:
-        if(p->namespaceIndex != 0 || p->identifier.byteString.length != 0) return UA_FALSE;
+        if(p->namespaceIndex != 0 || p->identifier.byteString.length != 0)
+            return UA_FALSE;
         break;
 
     default:
@@ -587,18 +594,21 @@ void UA_ExpandedNodeId_init(UA_ExpandedNodeId *p) {
 }
 
 UA_TYPE_NEW_DEFAULT(UA_ExpandedNodeId)
-UA_Int32 UA_ExpandedNodeId_copy(UA_ExpandedNodeId const *src, UA_ExpandedNodeId *dst) {
-    UA_Int32 retval = UA_SUCCESS;
-    if(src == UA_NULL || dst == UA_NULL) return UA_ERROR;
-    UA_String_copy(&src->namespaceUri, &dst->namespaceUri);
-    UA_NodeId_copy(&src->nodeId, &dst->nodeId);
-    UA_UInt32_copy(&src->serverIndex, &dst->serverIndex);
+UA_StatusCode UA_ExpandedNodeId_copy(UA_ExpandedNodeId const *src, UA_ExpandedNodeId *dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
+    retval |= UA_String_copy(&src->namespaceUri, &dst->namespaceUri);
+    retval |= UA_NodeId_copy(&src->nodeId, &dst->nodeId);
+    dst->serverIndex = src->serverIndex;
+    if(retval)
+        UA_ExpandedNodeId_deleteMembers(dst);
     return retval;
 }
 
 #ifdef DEBUG
 void UA_ExpandedNodeId_print(const UA_ExpandedNodeId *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "(UA_ExpandedNodeId){");
     UA_NodeId_print(&p->nodeId, stream);
     fprintf(stream, ",");
@@ -630,23 +640,26 @@ void UA_QualifiedName_init(UA_QualifiedName *p) {
 }
 
 UA_TYPE_NEW_DEFAULT(UA_QualifiedName)
-UA_Int32 UA_QualifiedName_copy(UA_QualifiedName const *src, UA_QualifiedName *dst) {
-    UA_Int32 retval = UA_SUCCESS;
-    if(src == UA_NULL || dst == UA_NULL) return UA_ERROR;
+UA_StatusCode UA_QualifiedName_copy(UA_QualifiedName const *src, UA_QualifiedName *dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
     retval |= UA_String_copy(&src->name, &dst->name);
-    retval |= UA_UInt16_copy(&src->namespaceIndex, &dst->namespaceIndex);
+    dst->namespaceIndex = src->namespaceIndex;
+    if(retval)
+        UA_QualifiedName_deleteMembers(dst);
     return retval;
 
 }
 
-UA_Int32 UA_QualifiedName_copycstring(char const *src, UA_QualifiedName *dst) {
+UA_StatusCode UA_QualifiedName_copycstring(char const *src, UA_QualifiedName *dst) {
     dst->namespaceIndex = 0;
     return UA_String_copycstring(src, &dst->name);
 }
 
 #ifdef DEBUG
 void UA_QualifiedName_print(const UA_QualifiedName *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "(UA_QualifiedName){");
     UA_UInt16_print(&p->namespaceIndex, stream);
     fprintf(stream, ",");
@@ -677,30 +690,33 @@ void UA_LocalizedText_init(UA_LocalizedText *p) {
 }
 
 UA_TYPE_NEW_DEFAULT(UA_LocalizedText)
-UA_Int32 UA_LocalizedText_copycstring(char const *src, UA_LocalizedText *dst) {
-    if(dst == UA_NULL) return UA_ERROR;
+UA_StatusCode UA_LocalizedText_copycstring(char const *src, UA_LocalizedText *dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
     UA_LocalizedText_init(dst);
-
-    UA_Int32 retval = UA_SUCCESS;
     retval |= UA_String_copycstring("en", &dst->locale); // TODO: Are language codes upper case?
-    if(retval != UA_SUCCESS) return retval;
     retval |= UA_String_copycstring(src, &dst->text);
+    if(retval)
+        UA_LocalizedText_deleteMembers(dst);
     return retval;
 }
 
-UA_Int32 UA_LocalizedText_copy(UA_LocalizedText const *src, UA_LocalizedText *dst) {
-    UA_Int32 retval = UA_SUCCESS;
-    if(!src || !dst) return UA_ERROR;
+UA_StatusCode UA_LocalizedText_copy(UA_LocalizedText const *src, UA_LocalizedText *dst) {
+    UA_Int32 retval = UA_STATUSCODE_GOOD;
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
     UA_LocalizedText_init(dst);
     retval |= UA_String_copy(&src->locale, &dst->locale);
-    if(retval != UA_SUCCESS) return retval;
     retval |= UA_String_copy(&src->text, &dst->text);
+    if(retval)
+        UA_LocalizedText_deleteMembers(dst);
     return retval;
 }
 
 #ifdef DEBUG
 void UA_LocalizedText_print(const UA_LocalizedText *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "(UA_LocalizedText){");
     UA_String_print(&p->locale, stream);
     fprintf(stream, ",");
@@ -725,18 +741,21 @@ void UA_ExtensionObject_init(UA_ExtensionObject *p) {
 }
 
 UA_TYPE_NEW_DEFAULT(UA_ExtensionObject)
-UA_Int32 UA_ExtensionObject_copy(UA_ExtensionObject const *src, UA_ExtensionObject *dst) {
-    UA_Int32 retval = UA_SUCCESS;
-    if(src == UA_NULL || dst == UA_NULL) return UA_ERROR;
+UA_StatusCode UA_ExtensionObject_copy(UA_ExtensionObject const *src, UA_ExtensionObject *dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
     dst->encoding = src->encoding;
     retval |= UA_ByteString_copy(&src->body, &dst->body);
     retval |= UA_NodeId_copy(&src->typeId, &dst->typeId);
+    if(retval)
+        UA_ExtensionObject_deleteMembers(dst);
     return retval;
 }
 
 #ifdef DEBUG
 void UA_ExtensionObject_print(const UA_ExtensionObject *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "(UA_ExtensionObject){");
     UA_NodeId_print(&p->typeId, stream);
     if(p->encoding == UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING)
@@ -769,22 +788,25 @@ void UA_DataValue_init(UA_DataValue *p) {
 }
 
 UA_TYPE_NEW_DEFAULT(UA_DataValue)
-UA_Int32 UA_DataValue_copy(UA_DataValue const *src, UA_DataValue *dst) {
-    UA_Int32 retval = UA_SUCCESS;
-    if(src == UA_NULL || dst == UA_NULL) return UA_ERROR;
-    UA_Byte_copy(&src->encodingMask, &dst->encodingMask);
-    UA_Int16_copy(&src->serverPicoseconds, &dst->serverPicoseconds);
-    UA_DateTime_copy(&src->serverTimestamp, &dst->serverTimestamp);
-    UA_Int16_copy(&src->sourcePicoseconds, &dst->sourcePicoseconds);
-    UA_DateTime_copy(&src->sourceTimestamp, &dst->sourceTimestamp);
-    UA_StatusCode_copy(&src->status, &dst->status);
-    UA_Variant_copy(&src->value, &dst->value);
+UA_StatusCode UA_DataValue_copy(UA_DataValue const *src, UA_DataValue *dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
+    dst->encodingMask = src->encodingMask;
+    dst->serverPicoseconds = src->serverPicoseconds;
+    retval |= UA_DateTime_copy(&src->serverTimestamp, &dst->serverTimestamp);
+    dst->sourcePicoseconds = src->sourcePicoseconds;
+    retval |= UA_DateTime_copy(&src->sourceTimestamp, &dst->sourceTimestamp);
+    dst->status = src->status;
+    retval |= UA_Variant_copy(&src->value, &dst->value);
+    if(retval)
+        UA_DataValue_deleteMembers(dst);
     return retval;
 }
 
 #ifdef DEBUG
 void UA_DataValue_print(const UA_DataValue *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "(UA_DataValue){");
     UA_Byte_print(&p->encodingMask, stream);
     fprintf(stream, ",");
@@ -807,7 +829,7 @@ void UA_DataValue_print(const UA_DataValue *p, FILE *stream) {
 UA_TYPE_DELETE_DEFAULT(UA_Variant)
 void UA_Variant_deleteMembers(UA_Variant *p) {
     if(p->storageType == UA_VARIANT_DATA) {
-        if(p->storage.data.dataPtr != UA_NULL) {
+        if(p->storage.data.dataPtr) {
             if(p->storage.data.arrayLength == 1)
                 p->vt->delete(p->storage.data.dataPtr);
             else
@@ -839,9 +861,10 @@ void UA_Variant_init(UA_Variant *p) {
 }
 
 /** It is not allowed to copy into a variant that points to an external data source. */
-UA_Int32 UA_Variant_copy(UA_Variant const *src, UA_Variant *dst) {
-    if(!src || !dst || dst->storageType == UA_VARIANT_DATASOURCE) return UA_ERROR;
-    UA_Int32 retval = UA_SUCCESS;
+UA_StatusCode UA_Variant_copy(UA_Variant const *src, UA_Variant *dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!src || !dst || dst->storageType == UA_VARIANT_DATASOURCE)
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     UA_VariantData *dstdata = &dst->storage.data;
     const UA_VariantData *srcdata;
@@ -849,20 +872,17 @@ UA_Int32 UA_Variant_copy(UA_Variant const *src, UA_Variant *dst) {
         srcdata = &src->storage.data;
     else {
         retval |= src->storage.datasource.read(src->storage.datasource.identifier, &srcdata);
-        if(retval != UA_SUCCESS)
-            return retval;
+        if(retval) return retval;
     }
 
     // now copy from srcdata to dstdata.
     dst->vt = src->vt;
     retval |= UA_Array_copy(srcdata->dataPtr, srcdata->arrayLength, src->vt, &dstdata->dataPtr);
-    if(retval != UA_SUCCESS)
-        goto clean_up;
+    if(retval) goto clean_up;
     dstdata->arrayLength = srcdata->arrayLength;
-    if(srcdata->arrayDimensions != UA_NULL) {
+    if(srcdata->arrayDimensions) {
         retval |= UA_Array_copy(srcdata->arrayDimensions, srcdata->arrayDimensionsLength, &UA_[UA_INT32], (void **)&dstdata->arrayDimensions);
-        if(retval != UA_SUCCESS)
-            goto clean_up2;
+        if(retval) goto clean_up2;
         dstdata->arrayDimensionsLength = srcdata->arrayDimensionsLength;
     }
 
@@ -874,7 +894,7 @@ UA_Int32 UA_Variant_copy(UA_Variant const *src, UA_Variant *dst) {
 
     // clean ups are falling through to the "lower levels"
  clean_up2:
-    if(dstdata->arrayDimensions != UA_NULL)
+    if(dstdata->arrayDimensions)
         UA_Array_delete(dstdata->dataPtr, dstdata->arrayLength, src->vt);
     
  clean_up:
@@ -885,31 +905,36 @@ UA_Int32 UA_Variant_copy(UA_Variant const *src, UA_Variant *dst) {
 }
 
 /** Copies data into a variant. The target variant has always a storagetype UA_VARIANT_DATA */
-UA_Int32 UA_Variant_copySetValue(UA_Variant *v, const UA_VTable_Entry *vt, const void *value) {
-    if(v == UA_NULL || vt == UA_NULL || value == UA_NULL)
-        return UA_ERROR;
+UA_StatusCode UA_Variant_copySetValue(UA_Variant *v, const UA_VTable_Entry *vt, const void *value) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!v || !vt || !value)
+        return UA_STATUSCODE_BADINTERNALERROR;
     UA_Variant_init(v);
     v->vt = vt;
     v->storage.data.arrayLength = 1; // no array but a single entry
-    UA_Int32 retval = UA_SUCCESS;
     retval |= vt->new(&v->storage.data.dataPtr);
-    if(retval == UA_SUCCESS)
-        retval |= vt->copy(value, v->storage.data.dataPtr);
+    retval |= vt->copy(value, v->storage.data.dataPtr);
+    if(retval)
+        UA_Variant_deleteMembers(v);
     return retval;
 }
-UA_Int32 UA_Variant_copySetArray(UA_Variant *v, const UA_VTable_Entry *vt, UA_Int32 arrayLength,
-                                 const void *array) {
-    if(v == UA_NULL || vt == UA_NULL || array == UA_NULL)
-        return UA_ERROR;
+UA_StatusCode UA_Variant_copySetArray(UA_Variant *v, const UA_VTable_Entry *vt, UA_Int32 arrayLength,
+                                      const void *array) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!v || !vt || !array)
+        return UA_STATUSCODE_BADINTERNALERROR;
     UA_Variant_init(v);
     v->vt = vt;
     v->storage.data.arrayLength = arrayLength;
-    return UA_Array_copy(array, arrayLength, vt, &v->storage.data.dataPtr);
+    retval = UA_Array_copy(array, arrayLength, vt, &v->storage.data.dataPtr);
+    if(retval)
+        UA_Variant_deleteMembers(v);
+    return retval;
 }
 
 #ifdef DEBUG
 void UA_Variant_print(const UA_Variant *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     UA_UInt32 ns0id = UA_ns0ToVTableIndex(&p->vt->typeId);
     if(p->storageType == UA_VARIANT_DATASOURCE) {
         fprintf(stream, "Variant from a Datasource");
@@ -956,30 +981,32 @@ void UA_DiagnosticInfo_init(UA_DiagnosticInfo *p) {
 }
 
 UA_TYPE_NEW_DEFAULT(UA_DiagnosticInfo)
-UA_Int32 UA_DiagnosticInfo_copy(UA_DiagnosticInfo const *src, UA_DiagnosticInfo *dst) {
-    UA_Int32 retval = UA_SUCCESS;
-    if(src == UA_NULL || dst == UA_NULL) return UA_ERROR;
+UA_StatusCode UA_DiagnosticInfo_copy(UA_DiagnosticInfo const *src, UA_DiagnosticInfo *dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(!src || !dst)
+        return UA_STATUSCODE_BADINTERNALERROR;
+    UA_DiagnosticInfo_deleteMembers(dst);
     retval |= UA_String_copy(&src->additionalInfo, &dst->additionalInfo);
-    retval |= UA_Byte_copy(&src->encodingMask, &dst->encodingMask);
+    dst->encodingMask = src->encodingMask;
     retval |= UA_StatusCode_copy(&src->innerStatusCode, &dst->innerStatusCode);
     if(src->innerDiagnosticInfo) {
         if((dst->innerDiagnosticInfo = UA_alloc(sizeof(UA_DiagnosticInfo))))
             retval |= UA_DiagnosticInfo_copy(src->innerDiagnosticInfo, dst->innerDiagnosticInfo);
         else
             retval |= UA_STATUSCODE_BADOUTOFMEMORY;
-    } else
-        dst->innerDiagnosticInfo = UA_NULL;
-    retval |= UA_Int32_copy(&src->locale, &dst->locale);
-    retval |= UA_Int32_copy(&src->localizedText, &dst->localizedText);
-    retval |= UA_Int32_copy(&src->namespaceUri, &dst->namespaceUri);
-    retval |= UA_Int32_copy(&src->symbolicId, &dst->symbolicId);
-
+    }
+    dst->locale = src->locale;
+    dst->localizedText = src->localizedText;
+    dst->namespaceUri = src->namespaceUri;
+    dst->symbolicId = src->symbolicId;
+    if(retval)
+        UA_DiagnosticInfo_deleteMembers(dst);
     return retval;
 }
 
 #ifdef DEBUG
 void UA_DiagnosticInfo_print(const UA_DiagnosticInfo *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "(UA_DiagnosticInfo){");
     UA_Byte_print(&p->encodingMask, stream);
     fprintf(stream, ",");
@@ -995,7 +1022,7 @@ void UA_DiagnosticInfo_print(const UA_DiagnosticInfo *p, FILE *stream) {
     fprintf(stream, ",");
     UA_StatusCode_print(&p->innerStatusCode, stream);
     fprintf(stream, ",");
-    if(p->innerDiagnosticInfo != UA_NULL) {
+    if(p->innerDiagnosticInfo) {
         fprintf(stream, "&");
         UA_DiagnosticInfo_print(p->innerDiagnosticInfo, stream);
     } else
@@ -1017,17 +1044,17 @@ void UA_InvalidType_init(UA_InvalidType *p) {
     return;
 }
 
-UA_Int32 UA_InvalidType_copy(UA_InvalidType const *src, UA_InvalidType *dst) {
-    return UA_ERR_INVALID_VALUE;
+UA_StatusCode UA_InvalidType_copy(UA_InvalidType const *src, UA_InvalidType *dst) {
+    return UA_STATUSCODE_BADINTERNALERROR;
 }
 
-UA_Int32 UA_InvalidType_new(UA_InvalidType **p) {
-    return UA_ERR_INVALID_VALUE;
+UA_StatusCode UA_InvalidType_new(UA_InvalidType **p) {
+    return UA_STATUSCODE_BADINTERNALERROR;
 }
 
 #ifdef DEBUG
 void UA_InvalidType_print(const UA_InvalidType *p, FILE *stream) {
-    if(p == UA_NULL || stream == UA_NULL) return;
+    if(!p || !stream) return;
     fprintf(stream, "(UA_InvalidType){ERROR (invalid type)}");
 }
 #endif
@@ -1036,27 +1063,26 @@ void UA_InvalidType_print(const UA_InvalidType *p, FILE *stream) {
 /* Array */
 /*********/
 
-UA_Int32 UA_Array_new(void **p, UA_Int32 noElements, const UA_VTable_Entry *vt) {
-    if(vt == UA_NULL)
-        return UA_ERROR;
+UA_StatusCode UA_Array_new(void **p, UA_Int32 noElements, const UA_VTable_Entry *vt) {
+    if(!vt) return UA_STATUSCODE_BADINTERNALERROR;
 
     if(noElements <= 0) {
         *p = UA_NULL;
-        return UA_SUCCESS;
+        return UA_STATUSCODE_GOOD;
     }
 
     // FIXME! Arrays cannot be larger than 2**20.
     // This was randomly chosen so that the development VM does not blow up.
     if(noElements > 1048576) {
         *p = UA_NULL;
-        return UA_ERROR;
+        return UA_STATUSCODE_BADINTERNALERROR;
     }
 
     if(!(*p = UA_alloc(vt->memSize * noElements)))
         return UA_STATUSCODE_BADOUTOFMEMORY;
 
     UA_Array_init(*p, noElements, vt);
-    return UA_SUCCESS;
+    return UA_STATUSCODE_GOOD;
 }
 
 void UA_Array_init(void *p, UA_Int32 noElements, const UA_VTable_Entry *vt) {
@@ -1080,13 +1106,13 @@ void UA_Array_delete(void *p, UA_Int32 noElements, const UA_VTable_Entry *vt) {
     UA_free(p);
 }
 
-UA_Int32 UA_Array_copy(const void *src, UA_Int32 noElements, const UA_VTable_Entry *vt, void **dst) {
+UA_StatusCode UA_Array_copy(const void *src, UA_Int32 noElements, const UA_VTable_Entry *vt, void **dst) {
     UA_Int32 retval;
-    if(src == UA_NULL || dst == UA_NULL || vt == UA_NULL)
-        return UA_ERROR;
+    if(!src || !dst || !vt)
+        return UA_STATUSCODE_BADINTERNALERROR;
 
     retval = UA_Array_new(dst, noElements, vt);
-    if(retval != UA_SUCCESS) {
+    if(retval) {
         *dst = UA_NULL;
         return retval;
     }
@@ -1095,13 +1121,13 @@ UA_Int32 UA_Array_copy(const void *src, UA_Int32 noElements, const UA_VTable_Ent
     char     *cdst    = (char *)*dst;
     UA_UInt32 memSize = vt->memSize;
     UA_Int32  i       = 0;
-    for(;i < noElements && retval == UA_SUCCESS;i++) {
+    for(;i < noElements && retval == UA_STATUSCODE_GOOD;i++) {
         retval |= vt->copy(csrc, cdst);
         csrc   += memSize;
         cdst   += memSize;
     }
 
-    if(retval != UA_SUCCESS) {
+    if(retval) {
         i--; // undo last increase
         UA_Array_delete(*dst, i, vt);
         *dst = UA_NULL;
@@ -1112,7 +1138,7 @@ UA_Int32 UA_Array_copy(const void *src, UA_Int32 noElements, const UA_VTable_Ent
 
 #ifdef DEBUG
 void UA_Array_print(const void *p, UA_Int32 noElements, const UA_VTable_Entry *vt, FILE *stream) {
-    if(p == UA_NULL || vt == UA_NULL || stream == UA_NULL) return;
+    if(!p || !vt || !stream) return;
     fprintf(stream, "(%s){", vt->name);
     char     *cp      = (char *)p; // so compilers allow pointer arithmetic
     UA_UInt32 memSize = vt->memSize;

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 311 - 437
src/ua_types_encoding_binary.c


+ 25 - 29
src/ua_types_encoding_binary.h

@@ -8,17 +8,22 @@
  * @defgroup encoding Datatype Encoding
  *
  * @brief Datatypes can have several encodings. The methods defined for
- * encodings and their signature are fixed.
+ * encodings and their signature are fixed. When supplied with an inappropriate
+ * null-pointer, these functions _will crash_. Exceptions are documented for the
+ * individual functions.
  *
  * - CalcSize: Returns the size of the (encoded) variable in bytes. This
- *    function is mainly used to allocate the bytestring into which the encoding
- *    is done.
+ *   function is mainly used to allocate the bytestring into which the encoding
+ *   is done.
  *
- * - Encode: Encodes a variable into a bytestring.
+ * - Encode: Encodes a variable into a bytestring. If an error occurs
+ *   (indicated by the return value), the bytestring may be left in an
+ *   inconsistent state.
  *
- * - Decode: Decodes a variable stored in a bytestring. It is assumed that the
- *   input variable (dst) is allocated in memory, but not its dynamically sized
- *   members.
+ * - Decode: Decodes a variable stored in a bytestring. The destination is
+ *   assumed to be clean (after an _init) before decoding into it. If an error
+ *   occurs (indicated by the return value), the destination value is cleaned
+ *   up (deleteMembers) before returning.
  */
 
 /**
@@ -31,27 +36,18 @@
  * @{
  */
 
-/* Stop decoding at the first failure. Free members that were already allocated.
-   It is assumed that retval is already defined. */
-#define CHECKED_DECODE(DECODE, CLEAN_UP) do { \
-        retval |= DECODE;                     \
-        if(retval != UA_SUCCESS) {            \
-            CLEAN_UP;                         \
-            return retval;                    \
-        } } while(0)
-
 #define UA_TYPE_CALCSIZEBINARY_AS(TYPE, TYPE_AS)       \
-    UA_Int32 TYPE##_calcSizeBinary(TYPE const *p) {    \
+    UA_UInt32 TYPE##_calcSizeBinary(TYPE const *p) {    \
         return TYPE_AS##_calcSizeBinary((TYPE_AS *)p); \
     }
 
-#define UA_TYPE_ENCODEBINARY_AS(TYPE, TYPE_AS)                                             \
-    UA_Int32 TYPE##_encodeBinary(TYPE const *src, UA_ByteString *dst, UA_UInt32 *offset) { \
-        return TYPE_AS##_encodeBinary((TYPE_AS *)src, dst, offset);                        \
+#define UA_TYPE_ENCODEBINARY_AS(TYPE, TYPE_AS)                          \
+    UA_StatusCode TYPE##_encodeBinary(TYPE const *src, UA_ByteString *dst, UA_UInt32 *offset) { \
+        return TYPE_AS##_encodeBinary((TYPE_AS *)src, dst, offset);     \
     }
 
 #define UA_TYPE_DECODEBINARY_AS(TYPE, TYPE_AS)                                             \
-    UA_Int32 TYPE##_decodeBinary(UA_ByteString const *src, UA_UInt32 *offset, TYPE *dst) { \
+    UA_StatusCode TYPE##_decodeBinary(UA_ByteString const *src, UA_UInt32 *offset, TYPE *dst) { \
         return TYPE_AS##_decodeBinary(src, offset, (TYPE_AS *)dst);                        \
     }
 #define UA_TYPE_BINARY_ENCODING_AS(TYPE, TYPE_AS) \
@@ -60,9 +56,9 @@
     UA_TYPE_DECODEBINARY_AS(TYPE, TYPE_AS)
 
 #define UA_TYPE_BINARY_ENCODING(TYPE)                                                     \
-    UA_Int32 TYPE##_calcSizeBinary(TYPE const *p);                                        \
-    UA_Int32 TYPE##_encodeBinary(TYPE const *src, UA_ByteString *dst, UA_UInt32 *offset); \
-    UA_Int32 TYPE##_decodeBinary(UA_ByteString const *src, UA_UInt32 *offset, TYPE *dst);
+    UA_UInt32 TYPE##_calcSizeBinary(TYPE const *p);                                        \
+    UA_StatusCode TYPE##_encodeBinary(TYPE const *src, UA_ByteString *dst, UA_UInt32 *offset); \
+    UA_StatusCode TYPE##_decodeBinary(UA_ByteString const *src, UA_UInt32 *offset, TYPE *dst);
 
 UA_TYPE_BINARY_ENCODING(UA_Boolean)
 UA_TYPE_BINARY_ENCODING(UA_SByte)
@@ -98,15 +94,15 @@ UA_TYPE_BINARY_ENCODING(UA_InvalidType)
 /*********/
 
 /* Computes the size of an array (incl. length field) in a binary blob. */
-UA_Int32 UA_Array_calcSizeBinary(UA_Int32 nElements, const UA_VTable_Entry *vt, const void *data);
+UA_UInt32 UA_Array_calcSizeBinary(UA_Int32 length, const UA_VTable_Entry *vt, const void *data);
 
 /* @brief Encodes an array into a binary blob. The array size is printed as well. */
-UA_Int32 UA_Array_encodeBinary(const void *src, UA_Int32 noElements, const UA_VTable_Entry *vt,
-                               UA_ByteString *dst, UA_UInt32 *offset);
+UA_StatusCode UA_Array_encodeBinary(const void *src, UA_Int32 length, const UA_VTable_Entry *vt,
+                                    UA_ByteString *dst, UA_UInt32 *offset);
 
 /* @brief Decodes an array from a binary blob. The array is allocated automatically before decoding. */
-UA_Int32 UA_Array_decodeBinary(const UA_ByteString *src, UA_UInt32 *offset, UA_Int32 noElements,
-                               const UA_VTable_Entry *vt, void **dst);
+UA_StatusCode UA_Array_decodeBinary(const UA_ByteString *src, UA_UInt32 *offset, UA_Int32 length,
+                                    const UA_VTable_Entry *vt, void **dst);
 
 /// @} /* end of group */
 

+ 2 - 1
src/ua_util.c

@@ -2,11 +2,12 @@
 
 /* the extern inline in a *.c-file is required for other compilation units to
    see the inline function. */
-extern INLINE UA_Int32 _UA_free(void *ptr, char *pname, char *f, UA_Int32 l);
 extern INLINE void UA_memcpy(void *dst, void const *src, UA_Int32 size);
 
 #ifdef DEBUG
+extern INLINE void _UA_free(void *ptr, char *pname, char *f, UA_Int32 l);
 extern INLINE void * _UA_alloc(UA_Int32 size, char *file, UA_Int32 line);
 #else
+extern INLINE void _UA_free(void *ptr);
 extern INLINE void * _UA_alloc(UA_Int32 size);
 #endif

+ 8 - 2
src/ua_util.h

@@ -39,12 +39,18 @@
 #endif
 
 /* Heap memory functions */
+#ifdef DEBUG
 #define UA_free(ptr) _UA_free(ptr, # ptr, __FILE__, __LINE__)
-INLINE UA_Int32 _UA_free(void *ptr, char *pname, char *f, UA_Int32 l) {
+INLINE void _UA_free(void *ptr, char *pname, char *f, UA_Int32 l) {
     DBG_VERBOSE(printf("UA_free;%p;;%s;;%s;%d\n", ptr, pname, f, l); fflush(stdout));
     free(ptr); // checks if ptr != NULL in the background
-    return UA_SUCCESS;
 }
+#else
+#define UA_free(ptr) _UA_free(ptr)
+INLINE void _UA_free(void *ptr) {
+    free(ptr); // checks if ptr != NULL in the background
+}
+#endif
 
 #ifdef DEBUG
 #define UA_alloc(size) _UA_alloc(size, __FILE__, __LINE__) 

+ 12 - 16
tools/generate_builtin.py

@@ -160,8 +160,7 @@ def createStructured(element):
         printh("UA_TYPE_XML_ENCODING(" + name + ")\n")
 
     # 4) CalcSizeBinary
-    printc('''UA_Int32 %(name)s_calcSizeBinary(%(name)s const * ptr) {
-    if(!ptr) return 0;
+    printc('''UA_UInt32 %(name)s_calcSizeBinary(%(name)s const * ptr) {
     return 0''')
     has_fixed_size = True
     for n,t in membermap.iteritems():
@@ -179,29 +178,27 @@ def createStructured(element):
         fixed_size.add(name)
 
     # 5) EncodeBinary
-    printc('''UA_Int32 %(name)s_encodeBinary(%(name)s const * src, UA_ByteString* dst, UA_UInt32 *offset) {
-    UA_Int32 retval = UA_SUCCESS;''')
+    printc('''UA_StatusCode %(name)s_encodeBinary(%(name)s const * src, UA_ByteString* dst, UA_UInt32 *offset) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;''')
     for n,t in membermap.iteritems():
         if t.find("*") != -1:
-            printc("\tretval |= UA_Array_encodeBinary(src->%(n)s,src->%(n)sSize,&UA_[" +
-                   t[0:t.find("*")].upper() + "],dst,offset);")
+            printc("\tretval |= UA_Array_encodeBinary(src->%(n)s,src->%(n)sSize,&UA_[" + t[0:t.find("*")].upper() + "],dst,offset);")
         else:
             printc('\tretval |= %(t)s_encodeBinary(&src->%(n)s,dst,offset);')
     printc("\treturn retval;\n}\n")
 
     # 6) DecodeBinary
-    printc('''UA_Int32 %(name)s_decodeBinary(UA_ByteString const * src, UA_UInt32 *offset, %(name)s * dst) {
-    UA_Int32 retval = UA_SUCCESS;''')
+    printc('''UA_StatusCode %(name)s_decodeBinary(UA_ByteString const * src, UA_UInt32 *offset, %(name)s * dst) {
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;''')
     printc('\t'+name+'_init(dst);')
     for n,t in membermap.iteritems():
         if t.find("*") != -1:
             printc('\tretval |= UA_Int32_decodeBinary(src,offset,&dst->%(n)sSize);')
-            printc('\tretval |= UA_Array_decodeBinary(src,offset,dst->%(n)sSize,&UA_[' +
-                   t[0:t.find("*")].upper() + '],(void**)&dst->%(n)s);')
-            printc('\tif(retval != UA_SUCCESS) { dst->%(n)sSize = -1; %(name)s_deleteMembers(dst); return retval;}') # arrays clean up internally. But the size needs to be set here for the eventual deleteMembers.
+            printc('\tif(!retval) { retval |= UA_Array_decodeBinary(src,offset,dst->%(n)sSize,&UA_[' + t[0:t.find("*")].upper() + '],(void**)&dst->%(n)s); }')
+            printc('\tif(retval) { dst->%(n)sSize = -1; }') # arrays clean up internally. But the size needs to be set here for the eventual deleteMembers.
         else:
             printc('\tretval |= %(t)s_decodeBinary(src,offset,&dst->%(n)s);')
-    printc("\tif(retval != UA_SUCCESS) %(name)s_deleteMembers(dst);")
+    printc("\tif(retval) %(name)s_deleteMembers(dst);")
     printc("\treturn retval;\n}\n")
 
     # 7) Xml
@@ -241,9 +238,8 @@ UA_TYPE_METHOD_DECODEXML_NOTIMPL(%(name)s)''')
     printc("UA_TYPE_NEW_DEFAULT(%(name)s)")
 
     # 12) Copy
-    printc('''UA_Int32 %(name)s_copy(const %(name)s *src,%(name)s *dst) {
-	UA_Int32 retval = UA_SUCCESS;
-    if(src == UA_NULL || dst == UA_NULL) return UA_ERROR;''')
+    printc('''UA_StatusCode %(name)s_copy(const %(name)s *src,%(name)s *dst) {
+	UA_StatusCode retval = UA_STATUSCODE_GOOD;''')
     printc("\t%(name)s_init(dst);")
     for n,t in membermap.iteritems():
         if t.find("*") != -1:
@@ -254,7 +250,7 @@ UA_TYPE_METHOD_DECODEXML_NOTIMPL(%(name)s)''')
             printc('\tretval |= %(t)s_copy(&src->%(n)s,&dst->%(n)s);')
             continue
         printc("\tdst->%(n)s = src->%(n)s;")
-    printc('''if(retval != UA_SUCCESS)
+    printc('''if(retval)
     %(name)s_deleteMembers(dst);''')
     printc("\treturn retval;\n}\n")