Ver código fonte

Merge branch 'master' into typedescription

Julius Pfrommer 10 anos atrás
pai
commit
45f980507d

+ 8 - 0
.travis.yml

@@ -25,6 +25,10 @@ before_install:
    - sudo apt-get install -qq --no-install-recommends build-essential cmake python-lxml graphviz doxygen wget
    - wget http://security.ubuntu.com/ubuntu/pool/main/c/check/check_0.9.10-6ubuntu3_amd64.deb
    - sudo dpkg -i check_0.9.10-6ubuntu3_amd64.deb
+   - wget https://launchpad.net/ubuntu/+source/liburcu/0.8.5-1ubuntu1/+build/6513813/+files/liburcu2_0.8.5-1ubuntu1_amd64.deb
+   - wget https://launchpad.net/ubuntu/+source/liburcu/0.8.5-1ubuntu1/+build/6513813/+files/liburcu-dev_0.8.5-1ubuntu1_amd64.deb
+   - sudo dpkg -i liburcu2_0.8.5-1ubuntu1_amd64.deb
+   - sudo dpkg -i liburcu-dev_0.8.5-1ubuntu1_amd64.deb
    - sudo pip install cpp-coveralls
    - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
    - sudo update-alternatives --config gcc
@@ -38,6 +42,10 @@ script:
    - cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake -DEXAMPLESERVER=ON ..
    - make
    - cd .. && rm build -rf && mkdir -p build && cd build
+   - echo "Compile multithreaded version"
+   - cmake -DMULTITHREADING=ON -DEXAMPLESERVER=ON ..
+   - make
+   - cd .. && rm build -rf && mkdir -p build && cd build
    - echo "Only needed profile"
    - cmake -DTYPES_ONLY_NEEDED=ON ..
    - make

+ 1 - 1
include/ua_server.h

@@ -262,7 +262,7 @@ typedef struct UA_ExternalNodeStore {
 } UA_ExternalNodeStore;
 
 UA_StatusCode UA_EXPORT
-UA_Server_addExternalNamespace(UA_Server *server, UA_UInt16 namespaceIndex, UA_ExternalNodeStore *nodeStore);
+UA_Server_addExternalNamespace(UA_Server *server, UA_UInt16 namespaceIndex, const UA_String *url, UA_ExternalNodeStore *nodeStore);
 
 /** @} */
 

+ 1 - 1
src/server/ua_services_attribute.c

@@ -372,7 +372,7 @@ static UA_StatusCode writeValue(UA_Server *server, UA_WriteValue *aWriteValue) {
             break;
 
         case UA_ATTRIBUTEID_VALUE:
-            if(newNode->nodeClass != (UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE)) {
+            if((newNode->nodeClass != UA_NODECLASS_VARIABLE) && (newNode->nodeClass != UA_NODECLASS_VARIABLETYPE)) {
                 retval = UA_STATUSCODE_BADWRITENOTSUPPORTED;
                 break;
             }

+ 31 - 4
src/server/ua_services_view.c

@@ -226,7 +226,7 @@ static void getBrowseResult(UA_NodeStore *ns, const UA_BrowseDescription *browse
 
 void Service_Browse(UA_Server *server, UA_Session *session, const UA_BrowseRequest *request,
                     UA_BrowseResponse *response) {
-    if(request->nodesToBrowseSize <= 0) {
+   if(request->nodesToBrowseSize <= 0) {
         response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
         return;
     }
@@ -237,11 +237,38 @@ void Service_Browse(UA_Server *server, UA_Session *session, const UA_BrowseReque
         response->responseHeader.serviceResult = retval;
         return;
     }
-        
+
+
+    /* ### Begin External Namespaces */
+    UA_Boolean *isExternal = UA_alloca(sizeof(UA_Boolean) * request->nodesToBrowseSize);
+    UA_memset(isExternal, UA_FALSE, sizeof(UA_Boolean) * request->nodesToBrowseSize);
+    UA_UInt32 *indices = UA_alloca(sizeof(UA_UInt32) * request->nodesToBrowseSize);
+    for(UA_Int32 j = 0;j<server->externalNamespacesSize;j++) {
+        UA_UInt32 indexSize = 0;
+        for(UA_Int32 i = 0;i < request->nodesToBrowseSize;i++) {
+            if(request->nodesToBrowse[i].nodeId.namespaceIndex != server->externalNamespaces[j].index)
+                continue;
+            isExternal[i] = UA_TRUE;
+            indices[indexSize] = i;
+            indexSize++;
+        }
+        if(indexSize == 0)
+            continue;
+
+        UA_ExternalNodeStore *ens = &server->externalNamespaces[j].externalNodeStore;
+        ens->browseNodes(ens->ensHandle, &request->requestHeader, request->nodesToBrowse,
+                       indices, indexSize, request->requestedMaxReferencesPerNode, response->results, response->diagnosticInfos);
+    }
+    /* ### End External Namespaces */
+
+
     response->resultsSize = request->nodesToBrowseSize;
-    for(UA_Int32 i = 0;i < request->nodesToBrowseSize;i++)
-        getBrowseResult(server->nodestore, &request->nodesToBrowse[i],
+    for(UA_Int32 i = 0;i < request->nodesToBrowseSize;i++){
+        if(!isExternal[i]) {
+            getBrowseResult(server->nodestore, &request->nodesToBrowse[i],
                         request->requestedMaxReferencesPerNode, &response->results[i]);
+        }
+    }
 }
 
 void Service_TranslateBrowsePathsToNodeIds(UA_Server *server, UA_Session *session,