ua_services_nodemanagement.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "ua_services.h"
  2. #include "ua_namespace_0.h"
  3. #include "ua_statuscodes.h"
  4. #include "ua_server_internal.h"
  5. #include "ua_services_internal.h"
  6. #include "ua_namespace_manager.h"
  7. #include "ua_session.h"
  8. #include "ua_util.h"
  9. void Service_AddNodes(UA_Server *server, UA_Session *session,
  10. const UA_AddNodesRequest *request, UA_AddNodesResponse *response) {
  11. UA_assert(server != NULL && session != NULL);
  12. if (request->nodesToAddSize <= 0) {
  13. response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
  14. return;
  15. }
  16. if (UA_Array_new((void **) &response->results, request->nodesToAddSize,
  17. &UA_TYPES[UA_ADDNODESRESULT]) != UA_STATUSCODE_GOOD) {
  18. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  19. return;
  20. }
  21. if (UA_Array_new((void **) &response->diagnosticInfos,
  22. request->nodesToAddSize, &UA_TYPES[UA_DIAGNOSTICINFO])
  23. != UA_STATUSCODE_GOOD) {
  24. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  25. return;
  26. }
  27. response->resultsSize = request->nodesToAddSize;
  28. UA_Int32 *numberOfFoundIndices;
  29. UA_UInt16 *associatedIndices;
  30. UA_UInt32 differentNamespaceIndexCount = 0;
  31. if (UA_Array_new((void **) &numberOfFoundIndices,
  32. request->nodesToAddSize, &UA_TYPES[UA_UINT32])
  33. != UA_STATUSCODE_GOOD) {
  34. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  35. return;
  36. }
  37. if (UA_Array_new((void **) &associatedIndices, request->nodesToAddSize,
  38. &UA_TYPES[UA_UINT16]) != UA_STATUSCODE_GOOD) {
  39. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  40. return;
  41. }
  42. // find out count of different namespace indices
  43. BUILD_INDEX_ARRAYS(request->nodesToAddSize,request->nodesToAdd,requestedNewNodeId.nodeId,differentNamespaceIndexCount,associatedIndices,numberOfFoundIndices);
  44. UA_UInt32 *addNodesIndices;
  45. if (UA_Array_new((void **) &addNodesIndices,
  46. request->nodesToAddSize, &UA_TYPES[UA_UINT32])
  47. != UA_STATUSCODE_GOOD) {
  48. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  49. return;
  50. }
  51. for (UA_UInt32 i = 0; i < differentNamespaceIndexCount; i++) {
  52. UA_Namespace *tmpNamespace;
  53. UA_NamespaceManager_getNamespace(server->namespaceManager,
  54. associatedIndices[i], &tmpNamespace);
  55. if (tmpNamespace != NULL) {
  56. //build up index array for each read operation onto a different namespace
  57. UA_UInt32 n = 0;
  58. for (UA_Int32 j = 0; j < request->nodesToAddSize; j++) {
  59. if (request->nodesToAdd[j].requestedNewNodeId.nodeId.namespaceIndex
  60. == associatedIndices[i]) {
  61. addNodesIndices[n] = j;
  62. n++;
  63. }
  64. }
  65. //call read for every namespace
  66. tmpNamespace->nodeStore->addNodes(&request->requestHeader,request->nodesToAdd,
  67. addNodesIndices, numberOfFoundIndices[i],
  68. response->results, response->diagnosticInfos);
  69. }
  70. }
  71. UA_free(addNodesIndices);
  72. UA_free(numberOfFoundIndices);
  73. UA_free(associatedIndices);
  74. }
  75. void Service_AddReferences(UA_Server *server, UA_Session *session,
  76. const UA_AddReferencesRequest *request,
  77. UA_AddReferencesResponse *response) {
  78. if (request->referencesToAddSize <= 0) {
  79. response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
  80. return;
  81. }
  82. if (UA_Array_new((void **) &response->results, request->referencesToAddSize,
  83. &UA_TYPES[UA_STATUSCODE]) != UA_STATUSCODE_GOOD) {
  84. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  85. return;
  86. }
  87. if (UA_Array_new((void **) &response->diagnosticInfos,
  88. request->referencesToAddSize, &UA_TYPES[UA_DIAGNOSTICINFO])
  89. != UA_STATUSCODE_GOOD) {
  90. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  91. return;
  92. }
  93. response->resultsSize = request->referencesToAddSize;
  94. UA_Int32 *numberOfFoundIndices;
  95. UA_UInt16 *associatedIndices;
  96. UA_UInt32 differentNamespaceIndexCount = 0;
  97. if (UA_Array_new((void **) &numberOfFoundIndices,
  98. request->referencesToAddSize, &UA_TYPES[UA_UINT32])
  99. != UA_STATUSCODE_GOOD) {
  100. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  101. return;
  102. }
  103. if (UA_Array_new((void **) &associatedIndices, request->referencesToAddSize,
  104. &UA_TYPES[UA_UINT16]) != UA_STATUSCODE_GOOD) {
  105. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  106. return;
  107. }
  108. // find out count of different namespace indices
  109. BUILD_INDEX_ARRAYS(request->referencesToAddSize, request->referencesToAdd, sourceNodeId,differentNamespaceIndexCount, associatedIndices, numberOfFoundIndices);
  110. UA_UInt32 *readValueIdIndices;
  111. if (UA_Array_new((void **) &readValueIdIndices,
  112. request->referencesToAddSize, &UA_TYPES[UA_UINT32])
  113. != UA_STATUSCODE_GOOD) {
  114. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  115. return;
  116. }
  117. for (UA_UInt32 i = 0; i < differentNamespaceIndexCount; i++) {
  118. UA_Namespace *tmpNamespace;
  119. UA_NamespaceManager_getNamespace(server->namespaceManager,
  120. associatedIndices[i], &tmpNamespace);
  121. if (tmpNamespace != NULL) {
  122. //build up index array for each read operation onto a different namespace
  123. UA_UInt32 n = 0;
  124. for (UA_Int32 j = 0; j < request->referencesToAddSize; j++) {
  125. if (request->referencesToAdd[j].sourceNodeId.namespaceIndex
  126. == associatedIndices[i]) {
  127. readValueIdIndices[n] = j;
  128. n++;
  129. }
  130. }
  131. //call read for every namespace
  132. tmpNamespace->nodeStore->addReferences(&request->requestHeader,request->referencesToAdd,
  133. readValueIdIndices, numberOfFoundIndices[i],
  134. response->results, response->diagnosticInfos);
  135. // response->results[i] = service_read_node(server, &request->nodesToRead[i]);
  136. }
  137. }
  138. UA_free(readValueIdIndices);
  139. UA_free(numberOfFoundIndices);
  140. UA_free(associatedIndices);
  141. /*
  142. for(UA_Int32 i = 0;i < response->resultsSize;i++){
  143. response->results[i] = service_read_node(server, &request->nodesToRead[i]);
  144. }
  145. }
  146. */
  147. //response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTIMPLEMENTED;
  148. }