ua_namespace_manager.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * ua_namespace_manager.c
  3. *
  4. * Created on: Oct 14, 2014
  5. * Author: opcua
  6. */
  7. #include "ua_namespace_manager.h"
  8. #include "ua_util.h"
  9. struct namespace_list_entry {
  10. UA_Namespace namespace;
  11. LIST_ENTRY(namespace_list_entry) pointers;
  12. };
  13. UA_StatusCode UA_NamespaceManager_init( UA_NamespaceManager* namespaceManager)
  14. {
  15. LIST_INIT(&namespaceManager->namespaces);
  16. namespaceManager->currentNamespaceCount = 0;
  17. return UA_STATUSCODE_GOOD;
  18. }
  19. void UA_NamespaceManager_deleteMembers(UA_NamespaceManager *namespaceManager)
  20. {
  21. struct namespace_list_entry *current = LIST_FIRST(&namespaceManager->namespaces);
  22. while(current) {
  23. LIST_REMOVE(current, pointers);
  24. UA_Namespace_deleteMembers(&current->namespace);
  25. UA_free(current);
  26. current = LIST_FIRST(&namespaceManager->namespaces);
  27. }
  28. }
  29. UA_StatusCode UA_NamespaceManager_createNamespace(UA_NamespaceManager *namespaceManager,UA_UInt16 index, UA_NodeStoreInterface *nodeStore)
  30. {
  31. if(namespaceManager->currentNamespaceCount<UA_UINT16_MAX){
  32. struct namespace_list_entry *newentry = UA_alloc(sizeof(struct namespace_list_entry));
  33. UA_Namespace_init(&newentry->namespace);
  34. newentry->namespace.index = index;
  35. if(nodeStore != UA_NULL ){
  36. newentry->namespace.nodeStore = UA_NodeStoreInterface_new();
  37. UA_NodeStoreInterface_copy(nodeStore,newentry->namespace.nodeStore);
  38. }
  39. namespaceManager->currentNamespaceCount++;
  40. LIST_INSERT_HEAD(&namespaceManager->namespaces, newentry, pointers);
  41. return UA_STATUSCODE_GOOD;
  42. }
  43. return UA_STATUSCODE_BADNOTFOUND;
  44. }
  45. UA_StatusCode UA_NamespaceManager_removeNamespace(UA_NamespaceManager *namespaceManager,UA_UInt16 index)
  46. {
  47. UA_Namespace *namespace;
  48. UA_NamespaceManager_getNamespace(namespaceManager,index,&namespace);
  49. if(namespace == UA_NULL)
  50. return UA_STATUSCODE_BADNOTFOUND;
  51. struct namespace_list_entry *current = UA_NULL;
  52. LIST_FOREACH(current, &namespaceManager->namespaces, pointers) {
  53. if(current->namespace.index == index)
  54. break;
  55. }
  56. if(!current)
  57. return UA_STATUSCODE_BADNOTFOUND;
  58. LIST_REMOVE(current, pointers);
  59. return UA_STATUSCODE_GOOD;
  60. }
  61. UA_Int32 UA_NamespaceManager_getNamespace(UA_NamespaceManager *namespaceManager, UA_UInt16 index, UA_Namespace **ns)
  62. {
  63. struct namespace_list_entry *current = UA_NULL;
  64. LIST_FOREACH(current, &namespaceManager->namespaces, pointers) {
  65. if(current->namespace.index == index)
  66. break;
  67. }
  68. if(!current) {
  69. *ns = UA_NULL;
  70. return UA_STATUSCODE_BADNOTFOUND;
  71. }
  72. *ns = &current->namespace;
  73. return UA_STATUSCODE_GOOD;
  74. }
  75. UA_Int32 UA_NamespaceManager_setNodeStore(UA_NamespaceManager *namespaceManager,UA_UInt16 index, UA_NodeStoreInterface *nodeStore)
  76. {
  77. UA_Namespace *namespace = UA_NULL;
  78. UA_NamespaceManager_getNamespace(namespaceManager, index, &namespace);
  79. if(namespace == UA_NULL)
  80. {
  81. return UA_STATUSCODE_BADNOTFOUND;
  82. }
  83. if(nodeStore != UA_NULL ){
  84. if(namespace->nodeStore == UA_NULL){
  85. namespace->nodeStore = UA_NodeStoreInterface_new();
  86. }
  87. }
  88. namespace->nodeStore = nodeStore;
  89. return UA_STATUSCODE_GOOD;
  90. }