/** @file @author Stefan Frings */ #ifndef HTTPSESSION_H #define HTTPSESSION_H #include #include #include #include #include #include "comic.h" /** 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. */ class HttpSession { 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; /** Null sessions cannot store data. All calls to set() and remove() 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 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(); //AÑADIDO //sets void setComicsOnDevice(const QSet & set); void setComicOnDevice(const QString & hash); void setDownloadedComic(const QString & hash); bool isComicOnDevice(const QString & hash); bool isComicDownloaded(const QString & hash); QSet getComicsOnDevice(); QSet getDownloadedComics(); void clearComics(); //current comic (import) qulonglong getCurrentComicId(); Comic * getCurrentComic(); void dismissCurrentComic(); void setCurrentComic(qulonglong id, Comic * comic); //current comic (read) qulonglong getCurrentRemoteComicId(); Comic * getCurrentRemoteComic(); void dismissCurrentRemoteComic(); void setCurrentRemoteComic(qulonglong id, Comic * comic); //device identification QString getDeviceType(); QString getDisplayType(); void setDeviceType(const QString & device); void setDisplayType(const QString & display); /*int popPage(); void pushPage(int page); int topPage(); void clearFoldersPath(); int popFolder(); void pushFolder(int page); int topFolder(); QStack getFoldersPath();*/ void clearNavigationPath(); QPair popNavigationItem(); QPair topNavigationItem(); void pushNavigationItem(const QPair & item); void updateTopItem(const QPair & item); //TODO replace QPair by a custom class for storing folderId, page and folderName(save some DB accesses) QStack > getNavigationPath(); private: struct YACReaderSessionData { //cómics disponibles en dispositivo QSet comicsOnDevice; //cómics que han sido descargados o están siendo descargados en esta sesión QSet downloadedComics; //cómic actual que está siendo descargado QString device; QString display; qulonglong comicId; qulonglong remoteComicId; //folder_id, page_number QStack > navigationPath; Comic * comic; Comic * remoteComic; }; 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 values; YACReaderSessionData yacreaderSessionData; }; /** Pointer to the shared data. */ HttpSessionData* dataPtr; }; #endif // HTTPSESSION_H