Browse Source

differentiate between UA_STRING and UA_STRING_ALLOC

Julius Pfrommer 10 years ago
parent
commit
f7eff5571c

+ 3 - 3
examples/server.c

@@ -194,7 +194,7 @@ int main(int argc, char** argv) {
 			.read = readTemperature,
 			.release = releaseTemperature,
 			.write = NULL};
-		UA_QualifiedName ledName = UA_QUALIFIEDNAME(0, "cpu temperature");
+		const UA_QualifiedName ledName = UA_QUALIFIEDNAME(0, "cpu temperature");
 		UA_Server_addDataSourceVariableNode(server, temperatureDataSource, ledName, UA_NODEID_NULL, 
                                             UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
                                             UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES));
@@ -229,8 +229,8 @@ int main(int argc, char** argv) {
     UA_Variant *myIntegerVariant = UA_Variant_new();
     UA_Int32 myInteger = 42;
     UA_Variant_setScalarCopy(myIntegerVariant, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
-    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(0, "the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
+    const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(0, "the answer");
+    const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
     UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
     UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
     UA_Server_addVariableNode(server, myIntegerVariant, myIntegerName,

+ 3 - 3
include/ua_types.h

@@ -324,7 +324,7 @@ UA_TYPE_HANDLING_FUNCTIONS(UA_DiagnosticInfo)
     allocated. If the memory cannot be allocated, a null-string is returned. */
 UA_String UA_EXPORT UA_String_fromChars(char const *src);
 #define UA_STRING_ALLOC(CHARS) UA_String_fromChars(CHARS)
-#define UA_STRING(CHARS) (const UA_String) {sizeof(CHARS), (UA_Byte*)CHARS }
+#define UA_STRING(CHARS) (const UA_String) {sizeof(CHARS)-1, (UA_Byte*)CHARS }
 #define UA_STRING_NULL (UA_String) {-1, (UA_Byte*)0 }
 
 /** Printf a char-array into a UA_String. Memory for the string data is allocated. */
@@ -416,11 +416,11 @@ UA_Boolean UA_EXPORT UA_ExpandedNodeId_isNull(const UA_ExpandedNodeId *p);
 /* QualifiedName */
 #define UA_QUALIFIEDNAME(NS_INDEX, CHARS) (const UA_QualifiedName) {    \
         .namespaceIndex = NS_INDEX, .name = UA_STRING(CHARS) }
-#define UA_QUALIFIEDNAME_ALLOC(NS_INDEX, CHARS) (const UA_QualifiedName) {    \
+#define UA_QUALIFIEDNAME_ALLOC(NS_INDEX, CHARS) (UA_QualifiedName) {    \
         .namespaceIndex = NS_INDEX, .name = UA_STRING_ALLOC(CHARS) }
 
 /* LocalizedText */
-#define UA_LOCALIZEDTEXT(LOCALE, TEXT) (UA_LocalizedText) {     \
+#define UA_LOCALIZEDTEXT(LOCALE, TEXT) (const UA_LocalizedText) {     \
         .locale = UA_STRING(LOCALE), .text = UA_STRING(TEXT) }
 #define UA_LOCALIZEDTEXT_ALLOC(LOCALE, TEXT) (UA_LocalizedText) {             \
         .locale = UA_STRING_ALLOC(LOCALE), .text = UA_STRING_ALLOC(TEXT) }

+ 2 - 2
src/client/ua_client.c

@@ -126,7 +126,7 @@ static UA_StatusCode SecureChannelHandshake(UA_Client *client) {
 
 	UA_AsymmetricAlgorithmSecurityHeader asymHeader;
 	UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader);
-	asymHeader.securityPolicyUri = UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None");
+	asymHeader.securityPolicyUri = UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#None");
 
     /* id of opensecurechannelrequest */
 	UA_NodeId requestType = UA_NODEID_NUMERIC(0, UA_NS0ID_OPENSECURECHANNELREQUEST + UA_ENCODINGOFFSET_BINARY);
@@ -394,7 +394,7 @@ static UA_StatusCode CloseSecureChannel(UA_Client *client) {
 UA_StatusCode UA_Client_connect(UA_Client *client, UA_ConnectionConfig conf,
                                 UA_ClientNetworkLayer networkLayer, char *endpointUrl)
 {
-    client->endpointUrl = UA_STRING(endpointUrl);
+    client->endpointUrl = UA_STRING_ALLOC(endpointUrl);
     if(client->endpointUrl.length < 0)
         return UA_STATUSCODE_BADOUTOFMEMORY;
 

+ 1 - 1
src/server/ua_securechannel_manager.c

@@ -76,7 +76,7 @@ UA_StatusCode UA_SecureChannelManager_open(UA_SecureChannelManager           *cm
 
     UA_ByteString_copy(&request->clientNonce, &entry->channel.clientNonce);
     entry->channel.serverAsymAlgSettings.securityPolicyUri =
-        UA_STRING("http://opcfoundation.org/UA/SecurityPolicy#None");
+        UA_STRING_ALLOC("http://opcfoundation.org/UA/SecurityPolicy#None");
     LIST_INSERT_HEAD(&cm->channels, entry, pointers);
 
     response->serverProtocolVersion = 0;

+ 7 - 3
src/server/ua_server.c

@@ -37,14 +37,18 @@ void UA_Server_addNetworkLayer(UA_Server *server, UA_ServerNetworkLayer networkL
     server->nlsSize++;
 
     if(networkLayer.discoveryUrl){
-		UA_String* newUrls = UA_realloc(server->description.discoveryUrls, sizeof(UA_String)*(server->description.discoveryUrlsSize+1)); //TODO: rework this pattern into *_array_insert
+        if(server->description.discoveryUrlsSize < 0)
+            server->description.discoveryUrlsSize = 0;
+		UA_String* newUrls = UA_realloc(server->description.discoveryUrls,
+                                        sizeof(UA_String)*(server->description.discoveryUrlsSize));
 		if(!newUrls) {
 			UA_LOG_ERROR(server->logger, UA_LOGGERCATEGORY_SERVER, "Adding discoveryUrl");
 			return;
 		}
 		server->description.discoveryUrls = newUrls;
-		UA_String_copy(networkLayer.discoveryUrl, &server->description.discoveryUrls[0]);
-		server->description.discoveryUrlsSize++;
+		UA_String_copy(networkLayer.discoveryUrl,
+                       &server->description.discoveryUrls[server->description.discoveryUrlsSize]);
+        server->description.discoveryUrlsSize++;
     }
 }
 

+ 1 - 1
src/ua_types.c

@@ -108,7 +108,7 @@ UA_StatusCode UA_String_copy(UA_String const *src, UA_String *dst) {
 
 UA_String UA_String_fromChars(char const *src) {
     UA_String str;
-    size_t length = strlen(src);
+    size_t length = sizeof(src)-1;
     if(length == 0) {
         str.length = 0;
         str.data = UA_NULL;

+ 8 - 10
tests/check_builtin.c

@@ -1287,9 +1287,9 @@ START_TEST(UA_Array_copyUA_StringShallWorkOnExample) {
 	UA_String *srcArray = UA_Array_new(&UA_TYPES[UA_TYPES_STRING], 3);
 	UA_String *dstArray;
 
-	srcArray[0] = UA_STRING("open");
-	srcArray[1] = UA_STRING("62541");
-	srcArray[2] = UA_STRING("opc ua");
+	srcArray[0] = UA_STRING_ALLOC("open");
+	srcArray[1] = UA_STRING_ALLOC("62541");
+	srcArray[2] = UA_STRING_ALLOC("opc ua");
 	//when
 	UA_Array_copy((const void *)srcArray, (void **)&dstArray, &UA_TYPES[UA_TYPES_STRING], 3);
 	//then
@@ -1434,15 +1434,13 @@ END_TEST
 
 START_TEST(UA_LocalizedText_copycstringShallWorkOnInputExample) {
 	// given
-	const char src[8] = {'t', 'e', 'X', 't', '1', '2', '3', (char)0};
-	UA_LocalizedText dst = UA_LOCALIZEDTEXT("", src);
+	char src[8] = {'t', 'e', 'X', 't', '1', '2', '3', (char)0};
+	const UA_LocalizedText dst = UA_LOCALIZEDTEXT("", src);
 
 	// then
 	ck_assert_int_eq('1', dst.text.data[4]);
 	ck_assert_int_eq(0, dst.locale.length);
 	ck_assert_int_eq(7, dst.text.length);
-	// finally
-	UA_LocalizedText_deleteMembers(&dst);
 }
 END_TEST
 
@@ -1503,9 +1501,9 @@ END_TEST
 START_TEST(UA_Variant_copyShallWorkOn1DArrayExample) {
 	// given
 	UA_String *srcArray = UA_Array_new(&UA_TYPES[UA_TYPES_STRING], 3);
-	srcArray[0] = UA_STRING("__open");
-	srcArray[1] = UA_STRING("_62541");
-	srcArray[2] = UA_STRING("opc ua");
+	srcArray[0] = UA_STRING_ALLOC("__open");
+	srcArray[1] = UA_STRING_ALLOC("_62541");
+	srcArray[2] = UA_STRING_ALLOC("opc ua");
 
 	UA_Int32 *dimensions;
 	dimensions = UA_malloc(sizeof(UA_Int32));

+ 2 - 0
tests/testing_networklayers.c

@@ -95,5 +95,7 @@ ServerNetworkLayerFileInput_new(UA_UInt32 files, char **filenames, void(*readCal
     nl.getWork = (UA_Int32 (*)(void*, UA_WorkItem**, UA_UInt16)) NetworkLayer_FileInput_getWork;
     nl.stop = (UA_Int32 (*)(void*, UA_WorkItem**)) NetworkLayer_FileInput_stop;
     nl.free = (void (*)(void*))NetworkLayer_FileInput_delete;
+    nl.discoveryUrl = UA_String_new();
+    *nl.discoveryUrl = UA_STRING_ALLOC("");
     return nl;
 }