| 
									
										
										
										
											2017-08-23 18:47:07 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |   @file | 
					
						
							|  |  |  |   @author Stefan Frings | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef HTTPSESSION_H
 | 
					
						
							|  |  |  | #define HTTPSESSION_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QByteArray>
 | 
					
						
							|  |  |  | #include <QVariant>
 | 
					
						
							|  |  |  | #include <QReadWriteLock>
 | 
					
						
							|  |  |  | #include "httpglobal.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-20 13:49:21 +01:00
										 |  |  | #include "export.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-03 20:23:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-11 09:32:15 +01:00
										 |  |  | namespace qtwebapp { | 
					
						
							| 
									
										
										
										
											2017-08-23 18:47:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   This class stores data for a single HTTP session. | 
					
						
							|  |  |  |   A session can store any number of key/value pairs. This class uses implicit | 
					
						
							|  |  |  |   sharing for read and write access. This class is thread safe. | 
					
						
							|  |  |  |   @see HttpSessionStore should be used to create and get instances of this class. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-03 20:23:38 +01:00
										 |  |  | class HTTPSERVER_API HttpSession { | 
					
						
							| 
									
										
										
										
											2017-08-23 18:47:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |       Constructor. | 
					
						
							|  |  |  |       @param canStore The session can store data, if this parameter is true. | 
					
						
							|  |  |  |       Otherwise all calls to set() and remove() do not have any effect. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     HttpSession(bool canStore=false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |       Copy constructor. Creates another HttpSession object that shares the | 
					
						
							|  |  |  |       data of the other object. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     HttpSession(const HttpSession& other); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |       Copy operator. Detaches from the current shared data and attaches to | 
					
						
							|  |  |  |       the data of the other object. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     HttpSession& operator= (const HttpSession& other); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |       Destructor. Detaches from the shared data. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     virtual ~HttpSession(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Get the unique ID of this session. This method is thread safe. */ | 
					
						
							|  |  |  |     QByteArray getId() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2018-03-03 20:23:38 +01:00
										 |  |  |       Null sessions cannot store data. All calls to set() and remove() | 
					
						
							| 
									
										
										
										
											2017-08-23 18:47:07 +02:00
										 |  |  |       do not have any effect.This method is thread safe. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     bool isNull() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Set a value. This method is thread safe. */ | 
					
						
							|  |  |  |     void set(const QByteArray& key, const QVariant& value); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Remove a value. This method is thread safe. */ | 
					
						
							|  |  |  |     void remove(const QByteArray& key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Get a value. This method is thread safe. */ | 
					
						
							|  |  |  |     QVariant get(const QByteArray& key) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Check if a key exists. This method is thread safe. */ | 
					
						
							|  |  |  |     bool contains(const QByteArray& key) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |       Get a copy of all data stored in this session. | 
					
						
							|  |  |  |       Changes to the session do not affect the copy and vice versa. | 
					
						
							|  |  |  |       This method is thread safe. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     QMap<QByteArray,QVariant> getAll() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |       Get the timestamp of last access. That is the time when the last | 
					
						
							|  |  |  |       HttpSessionStore::getSession() has been called. | 
					
						
							|  |  |  |       This method is thread safe. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     qint64 getLastAccess() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |       Set the timestamp of last access, to renew the timeout period. | 
					
						
							|  |  |  |       Called by  HttpSessionStore::getSession(). | 
					
						
							|  |  |  |       This method is thread safe. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     void setLastAccess(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct HttpSessionData { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** Unique ID */ | 
					
						
							|  |  |  |         QByteArray id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** Timestamp of last access, set by the HttpSessionStore */ | 
					
						
							|  |  |  |         qint64 lastAccess; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** Reference counter */ | 
					
						
							|  |  |  |         int refCount; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** Used to synchronize threads */ | 
					
						
							|  |  |  |         QReadWriteLock lock; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** Storage for the key/value pairs; */ | 
					
						
							|  |  |  |         QMap<QByteArray,QVariant> values; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Pointer to the shared data. */ | 
					
						
							|  |  |  |     HttpSessionData* dataPtr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // end of namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // HTTPSESSION_H
 |