ua_services_attribute.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include "ua_services.h"
  2. #include "ua_statuscodes.h"
  3. enum UA_AttributeId {
  4. UA_ATTRIBUTEID_NODEID = 1,
  5. UA_ATTRIBUTEID_NODECLASS = 2,
  6. UA_ATTRIBUTEID_BROWSENAME = 3,
  7. UA_ATTRIBUTEID_DISPLAYNAME = 4,
  8. UA_ATTRIBUTEID_DESCRIPTION = 5,
  9. UA_ATTRIBUTEID_WRITEMASK = 6,
  10. UA_ATTRIBUTEID_USERWRITEMASK = 7,
  11. UA_ATTRIBUTEID_ISABSTRACT = 8,
  12. UA_ATTRIBUTEID_SYMMETRIC = 9,
  13. UA_ATTRIBUTEID_INVERSENAME = 10,
  14. UA_ATTRIBUTEID_CONTAINSNOLOOPS = 11,
  15. UA_ATTRIBUTEID_EVENTNOTIFIER = 12,
  16. UA_ATTRIBUTEID_VALUE = 13,
  17. UA_ATTRIBUTEID_DATATYPE = 14,
  18. UA_ATTRIBUTEID_VALUERANK = 15,
  19. UA_ATTRIBUTEID_ARRAYDIMENSIONS = 16,
  20. UA_ATTRIBUTEID_ACCESSLEVEL = 17,
  21. UA_ATTRIBUTEID_USERACCESSLEVEL = 18,
  22. UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19,
  23. UA_ATTRIBUTEID_HISTORIZING = 20,
  24. UA_ATTRIBUTEID_EXECUTABLE = 21,
  25. UA_ATTRIBUTEID_USEREXECUTABLE = 22
  26. };
  27. static UA_DataValue * service_read_node(Application *app, const UA_ReadValueId *id) {
  28. UA_DataValue *v;
  29. UA_alloc((void **) &v, sizeof(UA_DataValue));
  30. namespace *ns = UA_indexedList_findValue(app->namespaces, id->nodeId.namespace);
  31. if (ns == UA_NULL) {
  32. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  33. v->status = UA_STATUSCODE_BADNODEIDUNKNOWN;
  34. return v;
  35. }
  36. UA_Node *node = UA_NULL;
  37. ns_lock *lock = UA_NULL;
  38. UA_Int32 result = get_node(ns, &id->nodeId, &node, &lock);
  39. if(result != UA_SUCCESS) {
  40. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  41. v->status = UA_STATUSCODE_BADNODEIDUNKNOWN;
  42. return v;
  43. }
  44. switch(id->attributeId) {
  45. case UA_ATTRIBUTEID_NODEID:
  46. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  47. v->status = UA_STATUSCODE_BADNOTREADABLE;
  48. break;
  49. case UA_ATTRIBUTEID_NODECLASS:
  50. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  51. v->status = UA_STATUSCODE_BADNOTREADABLE;
  52. break;
  53. case UA_ATTRIBUTEID_BROWSENAME:
  54. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  55. v->status = UA_STATUSCODE_BADNOTREADABLE;
  56. break;
  57. case UA_ATTRIBUTEID_DISPLAYNAME:
  58. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  59. v->status = UA_STATUSCODE_BADNOTREADABLE;
  60. break;
  61. case UA_ATTRIBUTEID_DESCRIPTION:
  62. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  63. v->status = UA_STATUSCODE_BADNOTREADABLE;
  64. break;
  65. case UA_ATTRIBUTEID_WRITEMASK:
  66. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  67. v->status = UA_STATUSCODE_BADNOTREADABLE;
  68. break;
  69. case UA_ATTRIBUTEID_USERWRITEMASK:
  70. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  71. v->status = UA_STATUSCODE_BADNOTREADABLE;
  72. break;
  73. case UA_ATTRIBUTEID_ISABSTRACT:
  74. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  75. v->status = UA_STATUSCODE_BADNOTREADABLE;
  76. break;
  77. case UA_ATTRIBUTEID_SYMMETRIC:
  78. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  79. v->status = UA_STATUSCODE_BADNOTREADABLE;
  80. break;
  81. case UA_ATTRIBUTEID_INVERSENAME:
  82. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  83. v->status = UA_STATUSCODE_BADNOTREADABLE;
  84. break;
  85. case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
  86. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  87. v->status = UA_STATUSCODE_BADNOTREADABLE;
  88. break;
  89. case UA_ATTRIBUTEID_EVENTNOTIFIER:
  90. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  91. v->status = UA_STATUSCODE_BADNOTREADABLE;
  92. break;
  93. case UA_ATTRIBUTEID_VALUE:
  94. if (node->nodeClass != UA_NODECLASS_VARIABLE) {
  95. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  96. v->status = UA_STATUSCODE_BADNOTREADABLE;
  97. break;
  98. }
  99. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE | UA_DATAVALUE_ENCODINGMASK_VARIANT;
  100. v->status = UA_STATUSCODE_GOOD;
  101. v->value = ((UA_VariableNode *)node)->value; // be careful not to release the node before encoding the message
  102. break;
  103. case UA_ATTRIBUTEID_DATATYPE:
  104. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  105. v->status = UA_STATUSCODE_BADNOTREADABLE;
  106. break;
  107. case UA_ATTRIBUTEID_VALUERANK:
  108. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  109. v->status = UA_STATUSCODE_BADNOTREADABLE;
  110. break;
  111. case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
  112. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  113. v->status = UA_STATUSCODE_BADNOTREADABLE;
  114. break;
  115. case UA_ATTRIBUTEID_ACCESSLEVEL:
  116. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  117. v->status = UA_STATUSCODE_BADNOTREADABLE;
  118. break;
  119. case UA_ATTRIBUTEID_USERACCESSLEVEL:
  120. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  121. v->status = UA_STATUSCODE_BADNOTREADABLE;
  122. break;
  123. case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
  124. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  125. v->status = UA_STATUSCODE_BADNOTREADABLE;
  126. break;
  127. case UA_ATTRIBUTEID_HISTORIZING:
  128. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  129. v->status = UA_STATUSCODE_BADNOTREADABLE;
  130. break;
  131. case UA_ATTRIBUTEID_EXECUTABLE:
  132. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  133. v->status = UA_STATUSCODE_BADNOTREADABLE;
  134. break;
  135. case UA_ATTRIBUTEID_USEREXECUTABLE:
  136. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  137. v->status = UA_STATUSCODE_BADNOTREADABLE;
  138. break;
  139. default:
  140. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  141. v->status = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
  142. break;
  143. }
  144. release_node(lock);
  145. return v;
  146. }
  147. UA_Int32 Service_Read(SL_Channel *channel, const UA_ReadRequest *request, UA_ReadResponse *response ) {
  148. if(channel->session == UA_NULL || channel->session->application == UA_NULL) return UA_ERROR; // TODO: Return error message
  149. int readsize = request->nodesToReadSize > 0 ? request->nodesToReadSize : 0;
  150. response->resultsSize = readsize;
  151. UA_alloc((void **)&response->results, sizeof(void *)*readsize);
  152. for(int i=0;i<readsize;i++) {
  153. response->results[i] = service_read_node(channel->session->application, request->nodesToRead[i]);
  154. }
  155. response->diagnosticInfosSize = -1;
  156. return UA_SUCCESS;
  157. }