ua_session.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #include "ua_session.h"
  4. UA_Int32 UA_Session_new(UA_Session **session) {
  5. UA_Int32 retval = UA_SUCCESS;
  6. retval |= UA_alloc((void **)session, sizeof(UA_Session));
  7. if(retval == UA_SUCCESS)
  8. UA_Session_init(*session);
  9. return retval;
  10. }
  11. /* mock up function to generate tokens for authentication */
  12. UA_Int32 UA_Session_generateToken(UA_NodeId *newToken) {
  13. //Random token generation
  14. UA_Int32 retval = UA_SUCCESS;
  15. srand(time(NULL));
  16. UA_Int32 i = 0;
  17. UA_Int32 r = 0;
  18. //retval |= UA_NodeId_new(newToken);
  19. newToken->namespaceIndex = 0; // where else?
  20. newToken->identifierType = UA_NODEIDTYPE_GUID;
  21. newToken->identifier.guid.data1 = rand();
  22. r = rand();
  23. newToken->identifier.guid.data2 = (UA_UInt16)((r>>16) );
  24. r = rand();
  25. UA_Int32 r1 = (r>>16);
  26. UA_Int32 r2 = r1 & 0xFFFF;
  27. r2 = r2 * 1;
  28. newToken->identifier.guid.data3 = (UA_UInt16)((r>>16) );
  29. for(i = 0;i < 8;i++) {
  30. r = rand();
  31. newToken->identifier.guid.data4[i] = (UA_Byte)((r>>28) );
  32. }
  33. return retval;
  34. }
  35. UA_Int32 UA_Session_init(UA_Session *session) {
  36. if(!session)
  37. return UA_ERROR;
  38. UA_NodeId_init(&session->authenticationToken);
  39. UA_NodeId_init(&session->sessionId);
  40. UA_String_init(&session->sessionName);
  41. session->maxRequestMessageSize = 0;
  42. session->maxResponseMessageSize = 0;
  43. session->timeout = 0;
  44. UA_DateTime_init(&session->validTill);
  45. session->channel = UA_NULL;
  46. return UA_SUCCESS;
  47. }
  48. UA_Int32 UA_Session_deleteMembers(UA_Session *session) {
  49. UA_Int32 retval = UA_SUCCESS;
  50. retval |= UA_NodeId_deleteMembers(&session->authenticationToken);
  51. retval |= UA_NodeId_deleteMembers(&session->sessionId);
  52. retval |= UA_String_deleteMembers(&session->sessionName);
  53. session->channel = UA_NULL;
  54. return retval;
  55. }
  56. UA_Int32 UA_Session_delete(UA_Session *session) {
  57. UA_Int32 retval = UA_SUCCESS;
  58. UA_Session_deleteMembers(session);
  59. retval |= UA_free(session);
  60. return retval;
  61. }
  62. UA_Boolean UA_Session_compare(UA_Session *session1, UA_Session *session2) {
  63. if(session1 && session2 &&
  64. UA_NodeId_equal(&session1->sessionId, &session2->sessionId) == UA_EQUAL)
  65. return UA_TRUE;
  66. return UA_FALSE;
  67. }
  68. UA_Int32 UA_Session_updateLifetime(UA_Session *session) {
  69. if(!session)
  70. return UA_ERROR;
  71. session->validTill = UA_DateTime_now() + session->timeout * 100000; //timeout in ms
  72. return UA_SUCCESS;
  73. }
  74. UA_Int32 UA_Session_getPendingLifetime(UA_Session *session, UA_Double *pendingLifetime_ms) {
  75. if(!session)
  76. return UA_ERROR;
  77. *pendingLifetime_ms = (session->validTill - UA_DateTime_now())/10000000; //difference in ms
  78. return UA_SUCCESS;
  79. }