summaryrefslogtreecommitdiff
path: root/board.cpp
diff options
context:
space:
mode:
authorJavier S. Pedro <maemo@javispedro.com>2013-04-04 00:00:38 +0200
committerJavier S. Pedro <maemo@javispedro.com>2013-04-04 00:00:38 +0200
commit5d8d6fed3fd7dd796a5a3093a7dbd46fab8d380a (patch)
tree56d1aa55260d0081cfd99b52c53f5ddc78cba200 /board.cpp
parenta6d8b23fd03993c0b94d21806ac3a36e251c8b9c (diff)
downloadtapasboard-5d8d6fed3fd7dd796a5a3093a7dbd46fab8d380a.tar.gz
tapasboard-5d8d6fed3fd7dd796a5a3093a7dbd46fab8d380a.zip
pass Board objects instead of boardUrls around QML
Diffstat (limited to 'board.cpp')
-rw-r--r--board.cpp82
1 files changed, 74 insertions, 8 deletions
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<QString, QString>::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<QString, QVariant> &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;