ua_services_nodemanagement.c 5.8 KB

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