#ifndef BOARD_H #define BOARD_H #include #include #include #include #include #include #include #include class Action; class XmlRpcInterface; class Board : public QObject { Q_OBJECT Q_PROPERTY(bool busy READ busy NOTIFY busyChanged) Q_PROPERTY(bool loggedIn READ loggedIn NOTIFY loggedInChanged) Q_PROPERTY(int rootForumId READ rootForumId CONSTANT) public: explicit Board(QObject *parent = 0); Board(const QUrl& url, const QString& username, const QString& password, QObject *parent = 0); ~Board(); static const QLatin1String CURRENT_DB_VERSION; bool busy() const; void enqueueAction(Action* action); QSqlDatabase database(); XmlRpcInterface *service(); int rootForumId() const; // Configuration table QString getConfig(const QString& key) const; void setConfig(const QString& key, const QString &value); // Login/logout stuff QVariant getLoginInfo(const QString& key) const; bool loggedIn() const; void login(const QString& username, const QString& password); void logout(); // Some helper functions QString removeHtml(QString text) const; QString removeBbcode(QString text) const; QString bbcodeToRichText(QString text) const; QString parseSmilies(QString text) const; QString renderHumanDate(const QDateTime& dateTime); QString renderHumanTime(const QDateTime& dateTime); public slots: void cancelAllActions(); // These functions wrap emitting the signals below void notifyConfigChanged(const QString& key = QString()); void notifyForumsChanged(); void notifyForumTopicsChanged(int forumId, int start, int end); void notifyTopicPostsChanged(int topicId, int start, int end); void notifyLogin(const QMap& info); void notifyLogout(); signals: void busyChanged(); void loggedInChanged(); void configChanged(const QString& key); void forumsChanged(); void forumTopicsChanged(int forumId, int start, int end); void topicPostsChanged(int topicId, int start, int end); private: static QString createSlug(const QUrl& url); static QString getDbPathFor(const QString& slug); static QString getTempDbPathFor(const QString& slug); bool checkCompatibleDb(); bool initializeDb(); bool eraseDb(); bool cleanDb(); bool removeFromActionQueue(Action *action); void executeActionFromQueue(); void initializeBbCode(); void initializeSmilies(); void fetchConfigIfOutdated(); void fetchForumsIfOutdated(); private slots: void handleActionFinished(Action *action); void handleActionError(Action *action, const QString& message); private: QUrl _url; QString _slug; QSqlDatabase _db; XmlRpcInterface *_iface; QQueue _queue; /** Configuration cache */ mutable QHash _config; QMap _loginInfo; QList< QPair > _bbcodes; QHash _smilies; QRegExp _smilieRegexp; }; inline bool Board::busy() const { return !_queue.empty(); } inline bool Board::loggedIn() const { return !_loginInfo.empty(); } inline int Board::rootForumId() const { return 0; } inline QSqlDatabase Board::database() { return _db; } inline XmlRpcInterface * Board::service() { return _iface; } #endif // BOARD_H