Pārlūkot izejas kodu

adding UA_Client_NamespaceGetIndex

Holger Jeromin 9 gadi atpakaļ
vecāks
revīzija
98f2051d19
2 mainītis faili ar 47 papildinājumiem un 0 dzēšanām
  1. 10 0
      include/ua_client.h
  2. 37 0
      src/client/ua_client.c

+ 10 - 0
include/ua_client.h

@@ -52,6 +52,16 @@ UA_TranslateBrowsePathsToNodeIdsResponse UA_EXPORT
     UA_Client_translateTranslateBrowsePathsToNodeIds(UA_Client *client,
                                                      UA_TranslateBrowsePathsToNodeIdsRequest *request);
 
+/**
+ * Get the namespace-index of a namespace-URI
+ *
+ * @param client The UA_Client struct for this connection
+ * @param namespaceUri The interested namespace URI
+ * @param namespaceIndex The namespace index of the URI. The value is unchanged in case of an error
+ * @return Indicates whether the operation succeeded or returns an error code
+ */
+UA_StatusCode UA_EXPORT UA_Client_NamespaceGetIndex(UA_Client *client, UA_String *namespaceUri, UA_UInt16 *namespaceIndex);
+
 /* NodeManagement Service Set */
 UA_AddNodesResponse UA_EXPORT UA_Client_addNodes(UA_Client *client, UA_AddNodesRequest *request);
 UA_AddReferencesResponse UA_EXPORT

+ 37 - 0
src/client/ua_client.c

@@ -629,6 +629,43 @@ UA_BrowseResponse UA_Client_browse(UA_Client *client, UA_BrowseRequest *request)
     return response;
 }
 
+UA_StatusCode UA_Client_NamespaceGetIndex(UA_Client *client, UA_String *namespaceUri, UA_UInt16 *namespaceIndex){
+	UA_ReadRequest ReadRequest;
+	UA_ReadResponse ReadResponse;
+	UA_StatusCode retval = UA_STATUSCODE_BADUNEXPECTEDERROR;
+
+	UA_ReadRequest_init(&ReadRequest);
+	ReadRequest.nodesToRead = UA_ReadValueId_new();
+	ReadRequest.nodesToReadSize = 1;
+	ReadRequest.nodesToRead[0].attributeId = UA_ATTRIBUTEID_VALUE;
+	ReadRequest.nodesToRead[0].nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY);
+
+	ReadResponse = UA_Client_read(client, &ReadRequest);
+	if(ReadResponse.responseHeader.serviceResult == UA_STATUSCODE_GOOD){
+		retval = UA_STATUSCODE_BADTYPEMISMATCH;
+		if(ReadResponse.resultsSize > 0 && ReadResponse.results[0].hasValue){
+			if(!UA_Variant_isScalar(&ReadResponse.results[0].value)){
+				if(ReadResponse.results[0].value.type == &UA_TYPES[UA_TYPES_STRING]){
+					retval = UA_STATUSCODE_BADNOTFOUND;
+					for(UA_UInt16 iterator = 0; iterator < ReadResponse.results[0].value.arrayLength;iterator++){
+						if(UA_String_equal(namespaceUri, &((UA_String*)ReadResponse.results[0].value.data)[iterator] )){
+							*namespaceIndex = iterator;
+							retval = UA_STATUSCODE_GOOD;
+						}
+					}
+				}
+			}
+		}
+	}else{
+		retval = ReadResponse.responseHeader.serviceResult;
+	}
+
+	UA_ReadResponse_deleteMembers(&ReadResponse);
+	UA_ReadRequest_deleteMembers(&ReadRequest);
+
+	return retval;
+}
+
 UA_BrowseNextResponse UA_Client_browseNext(UA_Client *client, UA_BrowseNextRequest *request) {
     UA_BrowseNextResponse response;
     synchronousRequest(client, request, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST], &response,