httpsession.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /**
  2. @file
  3. @author Stefan Frings
  4. */
  5. #include "httpsession.h"
  6. #include <QDateTime>
  7. #include <QUuid>
  8. using namespace stefanfrings;
  9. HttpSession::HttpSession(bool canStore)
  10. {
  11. if (canStore)
  12. {
  13. dataPtr=new HttpSessionData();
  14. dataPtr->refCount=1;
  15. dataPtr->lastAccess=QDateTime::currentMSecsSinceEpoch();
  16. dataPtr->id=QUuid::createUuid().toString().toLocal8Bit();
  17. #ifdef SUPERVERBOSE
  18. qDebug("HttpSession: (constructor) new session %s with refCount=1",dataPtr->id.constData());
  19. #endif
  20. }
  21. else
  22. {
  23. dataPtr=nullptr;
  24. }
  25. }
  26. HttpSession::HttpSession(const HttpSession& other)
  27. {
  28. dataPtr=other.dataPtr;
  29. if (dataPtr)
  30. {
  31. dataPtr->lock.lockForWrite();
  32. dataPtr->refCount++;
  33. #ifdef SUPERVERBOSE
  34. qDebug("HttpSession: (constructor) copy session %s refCount=%i",dataPtr->id.constData(),dataPtr->refCount);
  35. #endif
  36. dataPtr->lock.unlock();
  37. }
  38. }
  39. HttpSession& HttpSession::operator= (const HttpSession& other)
  40. {
  41. HttpSessionData* oldPtr=dataPtr;
  42. dataPtr=other.dataPtr;
  43. if (dataPtr)
  44. {
  45. dataPtr->lock.lockForWrite();
  46. dataPtr->refCount++;
  47. #ifdef SUPERVERBOSE
  48. qDebug("HttpSession: (operator=) session %s refCount=%i",dataPtr->id.constData(),dataPtr->refCount);
  49. #endif
  50. dataPtr->lastAccess=QDateTime::currentMSecsSinceEpoch();
  51. dataPtr->lock.unlock();
  52. }
  53. if (oldPtr)
  54. {
  55. int refCount;
  56. oldPtr->lock.lockForWrite();
  57. refCount=--oldPtr->refCount;
  58. #ifdef SUPERVERBOSE
  59. qDebug("HttpSession: (operator=) session %s refCount=%i",oldPtr->id.constData(),oldPtr->refCount);
  60. #endif
  61. oldPtr->lock.unlock();
  62. if (refCount==0)
  63. {
  64. qDebug("HttpSession: deleting old data");
  65. delete oldPtr;
  66. }
  67. }
  68. return *this;
  69. }
  70. HttpSession::~HttpSession()
  71. {
  72. if (dataPtr) {
  73. int refCount;
  74. dataPtr->lock.lockForWrite();
  75. refCount=--dataPtr->refCount;
  76. #ifdef SUPERVERBOSE
  77. qDebug("HttpSession: (destructor) session %s refCount=%i",dataPtr->id.constData(),dataPtr->refCount);
  78. #endif
  79. dataPtr->lock.unlock();
  80. if (refCount==0)
  81. {
  82. qDebug("HttpSession: deleting data");
  83. delete dataPtr;
  84. }
  85. }
  86. }
  87. const QByteArray& HttpSession::getId() const
  88. {
  89. static const QByteArray nullId;
  90. return (dataPtr) ? dataPtr->id : nullId;
  91. }
  92. bool HttpSession::isNull() const {
  93. return dataPtr==nullptr;
  94. }
  95. void HttpSession::set(const QByteArray& key, const QVariant& value)
  96. {
  97. if (dataPtr)
  98. {
  99. dataPtr->lock.lockForWrite();
  100. dataPtr->values.insert(key,value);
  101. dataPtr->lock.unlock();
  102. }
  103. }
  104. void HttpSession::remove(const QByteArray& key)
  105. {
  106. if (dataPtr)
  107. {
  108. dataPtr->lock.lockForWrite();
  109. dataPtr->values.remove(key);
  110. dataPtr->lock.unlock();
  111. }
  112. }
  113. QVariant HttpSession::get(const QByteArray& key) const
  114. {
  115. QVariant value;
  116. if (dataPtr)
  117. {
  118. dataPtr->lock.lockForRead();
  119. value=dataPtr->values.value(key);
  120. dataPtr->lock.unlock();
  121. }
  122. return value;
  123. }
  124. bool HttpSession::contains(const QByteArray& key) const
  125. {
  126. bool found=false;
  127. if (dataPtr)
  128. {
  129. dataPtr->lock.lockForRead();
  130. found=dataPtr->values.contains(key);
  131. dataPtr->lock.unlock();
  132. }
  133. return found;
  134. }
  135. QMap<QByteArray,QVariant> HttpSession::getAll() const
  136. {
  137. QMap<QByteArray,QVariant> values;
  138. if (dataPtr)
  139. {
  140. dataPtr->lock.lockForRead();
  141. values=dataPtr->values;
  142. dataPtr->lock.unlock();
  143. }
  144. return values;
  145. }
  146. qint64 HttpSession::getLastAccess() const
  147. {
  148. qint64 value=0;
  149. if (dataPtr)
  150. {
  151. dataPtr->lock.lockForRead();
  152. value=dataPtr->lastAccess;
  153. dataPtr->lock.unlock();
  154. }
  155. return value;
  156. }
  157. void HttpSession::setLastAccess()
  158. {
  159. if (dataPtr)
  160. {
  161. dataPtr->lock.lockForWrite();
  162. dataPtr->lastAccess=QDateTime::currentMSecsSinceEpoch();
  163. dataPtr->lock.unlock();
  164. }
  165. }