From 5d8d6fed3fd7dd796a5a3093a7dbd46fab8d380a Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Thu, 4 Apr 2013 00:00:38 +0200 Subject: pass Board objects instead of boardUrls around QML --- board.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 8 deletions(-) (limited to 'board.cpp') diff --git a/board.cpp b/board.cpp index 2df4711..1a82a91 100644 --- a/board.cpp +++ b/board.cpp @@ -12,8 +12,13 @@ const QLatin1String Board::CURRENT_DB_VERSION("testing2"); -Board::Board(const QString& forumUrl, QObject *parent) : - QObject(parent), _url(forumUrl), _slug(createSlug(forumUrl)), +Board::Board(QObject *parent) : + QObject(parent) +{ +} + +Board::Board(const QUrl& url, const QString& username, const QString& password, QObject *parent) : + QObject(parent), _url(url), _slug(createSlug(url)), _db(QSqlDatabase::addDatabase("QSQLITE", _slug)), _iface(new XmlRpcInterface(QUrl(_url), this)) { @@ -35,6 +40,9 @@ Board::Board(const QString& forumUrl, QObject *parent) : initializeDb(); } fetchConfigIfOutdated(); + if (!username.isEmpty()) { + login(username, password); + } fetchForumsIfOutdated(); initializeBbCode(); // TODO This might depend on board config initializeSmilies(); @@ -43,7 +51,9 @@ Board::Board(const QString& forumUrl, QObject *parent) : Board::~Board() { disconnect(this, SLOT(handleActionFinished(Action*))); - QSqlDatabase::removeDatabase(_slug); + if (!_slug.isEmpty()) { + QSqlDatabase::removeDatabase(_slug); + } } void Board::enqueueAction(Action *action) @@ -68,6 +78,7 @@ void Board::enqueueAction(Action *action) if (_queue.size() == 1) { // There were no actions queued, so start by executing this one. executeActionFromQueue(); + emit busyChanged(); } } @@ -98,7 +109,6 @@ QString Board::getConfig(const QString &key) const void Board::setConfig(const QString &key, const QString &value) { - // Try config cache first QHash::const_iterator i = _config.find(key); if (i != _config.end()) { @@ -121,6 +131,21 @@ void Board::setConfig(const QString &key, const QString &value) notifyConfigChanged(key); } +QVariant Board::getLoginInfo(const QString &key) const +{ + return _loginInfo[key]; +} + +void Board::login(const QString &username, const QString &password) +{ + // TODO +} + +void Board::logout() +{ + // TODO +} + QString Board::removeHtml(QString text) const { static const QRegExp regexp("<[a-zA-Z\\/][^>]*>"); @@ -187,6 +212,15 @@ QString Board::renderHumanTime(const QDateTime &dateTime) return dateTime.toLocalTime().time().toString(Qt::DefaultLocaleShortDate); } +void Board::cancelAllActions() +{ + disconnect(this, SLOT(handleActionFinished(Action*))); + while (!_queue.isEmpty()) { + Action *action = _queue.dequeue(); + delete action; + } +} + void Board::notifyConfigChanged(const QString& key) { if (!key.isEmpty()) { @@ -215,12 +249,33 @@ void Board::notifyTopicPostsChanged(int topicId, int start, int end) emit topicPostsChanged(topicId, start, end); } -QString Board::createSlug(const QString &forumUrl) +void Board::notifyLogin(const QMap &info) +{ + if (_loginInfo.empty()) { + _loginInfo = info; + qDebug() << "Now logged in as" << _loginInfo["username"].toString(); + emit loggedInChanged(); + } else { + // Double login? + _loginInfo = info; + } +} + +void Board::notifyLogout() +{ + if (!_loginInfo.empty()) { + _loginInfo.clear(); + emit loggedInChanged(); + } +} + +QString Board::createSlug(const QUrl& url) { static const QRegExp regexp("[^a-z0-9]+"); - QString url = forumUrl.toLower(); - url.replace(regexp, "_"); - return url; + QString slug = url.toString(QUrl::RemoveScheme | QUrl::RemoveUserInfo | QUrl::StripTrailingSlash); + slug = slug.toLower(); + slug.replace(regexp, "_"); + return slug; } QString Board::getDbPathFor(const QString &slug) @@ -242,6 +297,12 @@ bool Board::checkCompatibleDb() bool Board::initializeDb() { QSqlQuery q(_db); + + if (!q.exec("PRAGMA synchronous = OFF")) { + qWarning() << "Could not disable synchronous flag:" << q.lastError().text(); + // Not fatal + } + if (!q.exec("CREATE TABLE IF NOT EXISTS config (key TEXT PRIMARY KEY, value TEXT)")) { qWarning() << "Could not create config table:" << q.lastError().text(); return false; @@ -338,6 +399,11 @@ bool Board::removeFromActionQueue(Action *action) executeActionFromQueue(); } action->deleteLater(); + // Don't use delete here because this might be called in response to + // error() or finished() QNetworkReply signals. + if (_queue.isEmpty()) { + emit busyChanged(); + } return true; } return false; -- cgit v1.2.3