Bit of refactoring, enhanced reporting of state during messages obtaining.
This commit is contained in:
parent
846cd1eac5
commit
df10d6673e
10 changed files with 54 additions and 46 deletions
|
@ -88,7 +88,7 @@ void FeedDownloader::stopRunningUpdate() {
|
||||||
m_feeds.clear();
|
m_feeds.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedDownloader::oneFeedUpdateFinished(const QList<Message> &messages) {
|
void FeedDownloader::oneFeedUpdateFinished(const QList<Message> &messages, bool error_during_obtaining) {
|
||||||
QMutexLocker locker(m_mutex);
|
QMutexLocker locker(m_mutex);
|
||||||
|
|
||||||
m_feedsUpdated++;
|
m_feedsUpdated++;
|
||||||
|
@ -106,7 +106,7 @@ void FeedDownloader::oneFeedUpdateFinished(const QList<Message> &messages) {
|
||||||
<< feed->id() << " in thread: \'"
|
<< feed->id() << " in thread: \'"
|
||||||
<< QThread::currentThreadId() << "\'.";
|
<< QThread::currentThreadId() << "\'.";
|
||||||
|
|
||||||
int updated_messages = feed->updateMessages(messages);
|
int updated_messages = feed->updateMessages(messages, error_during_obtaining);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
QMetaObject::invokeMethod(feed, "updateMessages", Qt::BlockingQueuedConnection,
|
QMetaObject::invokeMethod(feed, "updateMessages", Qt::BlockingQueuedConnection,
|
||||||
|
|
|
@ -71,7 +71,7 @@ class FeedDownloader : public QObject {
|
||||||
void stopRunningUpdate();
|
void stopRunningUpdate();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void oneFeedUpdateFinished(const QList<Message> &messages);
|
void oneFeedUpdateFinished(const QList<Message> &messages, bool error_during_obtaining);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
// Emitted if feed updates started.
|
// Emitted if feed updates started.
|
||||||
|
|
|
@ -50,7 +50,7 @@ QVariant Feed::data(int column, int role) const {
|
||||||
case NewMessages:
|
case NewMessages:
|
||||||
return QColor(Qt::blue);
|
return QColor(Qt::blue);
|
||||||
|
|
||||||
case Error:
|
case NetworkError:
|
||||||
case ParsingError:
|
case ParsingError:
|
||||||
case OtherError:
|
case OtherError:
|
||||||
return QColor(Qt::red);
|
return QColor(Qt::red);
|
||||||
|
@ -146,44 +146,44 @@ void Feed::run() {
|
||||||
<< customId() << " in thread: \'"
|
<< customId() << " in thread: \'"
|
||||||
<< QThread::currentThreadId() << "\'.";
|
<< QThread::currentThreadId() << "\'.";
|
||||||
|
|
||||||
QList<Message> msgs = obtainNewMessages();
|
bool error_during_obtaining;
|
||||||
emit messagesObtained(msgs);
|
QList<Message> msgs = obtainNewMessages(&error_during_obtaining);
|
||||||
|
emit messagesObtained(msgs, error_during_obtaining);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Feed::updateMessages(const QList<Message> &messages) {
|
int Feed::updateMessages(const QList<Message> &messages, bool error_during_obtaining) {
|
||||||
|
QList<RootItem*> items_to_update;
|
||||||
|
int updated_messages = 0;
|
||||||
bool is_main_thread = QThread::currentThread() == qApp->thread();
|
bool is_main_thread = QThread::currentThread() == qApp->thread();
|
||||||
|
|
||||||
qDebug("Updating messages in DB. Main thread: '%s'.", qPrintable(is_main_thread ? "true." : "false."));
|
qDebug("Updating messages in DB. Main thread: '%s'.", qPrintable(is_main_thread ? "true." : "false."));
|
||||||
|
|
||||||
int custom_id = customId();
|
if (!error_during_obtaining) {
|
||||||
int account_id = getParentServiceRoot()->accountId();
|
bool anything_updated = false;
|
||||||
bool anything_updated = false;
|
bool ok = true;
|
||||||
bool ok;
|
|
||||||
QSqlDatabase database = is_main_thread ?
|
if (!messages.isEmpty()) {
|
||||||
qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings) :
|
int custom_id = customId();
|
||||||
qApp->database()->connection(QSL("feed_upd"), DatabaseFactory::FromSettings);
|
int account_id = getParentServiceRoot()->accountId();
|
||||||
int updated_messages = DatabaseQueries::updateMessages(database, messages, custom_id, account_id, url(), &anything_updated, &ok);
|
QSqlDatabase database = is_main_thread ?
|
||||||
|
qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings) :
|
||||||
if (ok) {
|
qApp->database()->connection(QSL("feed_upd"), DatabaseFactory::FromSettings);
|
||||||
if (updated_messages > 0) {
|
updated_messages = DatabaseQueries::updateMessages(database, messages, custom_id, account_id, url(), &anything_updated, &ok);
|
||||||
setStatus(NewMessages);
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
setStatus(Normal);
|
if (ok) {
|
||||||
|
setStatus(updated_messages > 0 ? NewMessages : Normal);
|
||||||
|
updateCounts(true);
|
||||||
|
|
||||||
|
if (getParentServiceRoot()->recycleBin() != nullptr && anything_updated) {
|
||||||
|
getParentServiceRoot()->recycleBin()->updateCounts(true);
|
||||||
|
items_to_update.append(getParentServiceRoot()->recycleBin());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<RootItem*> items_to_update;
|
|
||||||
|
|
||||||
updateCounts(true);
|
|
||||||
items_to_update.append(this);
|
|
||||||
|
|
||||||
if (getParentServiceRoot()->recycleBin() != nullptr && anything_updated) {
|
|
||||||
getParentServiceRoot()->recycleBin()->updateCounts(true);
|
|
||||||
items_to_update.append(getParentServiceRoot()->recycleBin());
|
|
||||||
}
|
|
||||||
|
|
||||||
getParentServiceRoot()->itemChanged(items_to_update);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
items_to_update.append(this);
|
||||||
|
getParentServiceRoot()->itemChanged(items_to_update);
|
||||||
|
|
||||||
return updated_messages;
|
return updated_messages;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ class Feed : public RootItem, public QRunnable {
|
||||||
enum Status {
|
enum Status {
|
||||||
Normal = 0,
|
Normal = 0,
|
||||||
NewMessages = 1,
|
NewMessages = 1,
|
||||||
Error = 2,
|
NetworkError = 2,
|
||||||
ParsingError = 3,
|
ParsingError = 3,
|
||||||
OtherError = 4
|
OtherError = 4
|
||||||
};
|
};
|
||||||
|
@ -83,14 +83,14 @@ class Feed : public RootItem, public QRunnable {
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void updateCounts(bool including_total_count);
|
void updateCounts(bool including_total_count);
|
||||||
int updateMessages(const QList<Message> &messages);
|
int updateMessages(const QList<Message> &messages, bool error_during_obtaining);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Performs synchronous obtaining of new messages for this feed.
|
// Performs synchronous obtaining of new messages for this feed.
|
||||||
virtual QList<Message> obtainNewMessages() = 0;
|
virtual QList<Message> obtainNewMessages(bool *error_during_obtaining) = 0;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void messagesObtained(QList<Message> messages);
|
void messagesObtained(QList<Message> messages, bool error_during_obtaining);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_url;
|
QString m_url;
|
||||||
|
|
|
@ -108,15 +108,17 @@ OwnCloudServiceRoot *OwnCloudFeed::serviceRoot() const {
|
||||||
return qobject_cast<OwnCloudServiceRoot*>(getParentServiceRoot());
|
return qobject_cast<OwnCloudServiceRoot*>(getParentServiceRoot());
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Message> OwnCloudFeed::obtainNewMessages() {
|
QList<Message> OwnCloudFeed::obtainNewMessages(bool *error_during_obtaining) {
|
||||||
OwnCloudGetMessagesResponse messages = serviceRoot()->network()->getMessages(customId());
|
OwnCloudGetMessagesResponse messages = serviceRoot()->network()->getMessages(customId());
|
||||||
|
|
||||||
if (serviceRoot()->network()->lastError() != QNetworkReply::NoError) {
|
if (serviceRoot()->network()->lastError() != QNetworkReply::NoError) {
|
||||||
setStatus(Feed::Error);
|
setStatus(Feed::NetworkError);
|
||||||
|
*error_during_obtaining = true;
|
||||||
serviceRoot()->itemChanged(QList<RootItem*>() << this);
|
serviceRoot()->itemChanged(QList<RootItem*>() << this);
|
||||||
return QList<Message>();
|
return QList<Message>();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
*error_during_obtaining = false;
|
||||||
return messages.messages();
|
return messages.messages();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ class OwnCloudFeed : public Feed {
|
||||||
OwnCloudServiceRoot *serviceRoot() const;
|
OwnCloudServiceRoot *serviceRoot() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<Message> obtainNewMessages();
|
QList<Message> obtainNewMessages(bool *error_during_obtaining);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // OWNCLOUDFEED_H
|
#endif // OWNCLOUDFEED_H
|
||||||
|
|
|
@ -430,7 +430,7 @@ bool StandardFeed::editItself(StandardFeed *new_feed_data) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Message> StandardFeed::obtainNewMessages() {
|
QList<Message> StandardFeed::obtainNewMessages(bool *error_during_obtaining) {
|
||||||
QByteArray feed_contents;
|
QByteArray feed_contents;
|
||||||
int download_timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt();
|
int download_timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt();
|
||||||
m_networkError = NetworkFactory::downloadFeedFile(url(), download_timeout, feed_contents,
|
m_networkError = NetworkFactory::downloadFeedFile(url(), download_timeout, feed_contents,
|
||||||
|
@ -438,11 +438,13 @@ QList<Message> StandardFeed::obtainNewMessages() {
|
||||||
|
|
||||||
if (m_networkError != QNetworkReply::NoError) {
|
if (m_networkError != QNetworkReply::NoError) {
|
||||||
qWarning("Error during fetching of new messages for feed '%s' (id %d).", qPrintable(url()), id());
|
qWarning("Error during fetching of new messages for feed '%s' (id %d).", qPrintable(url()), id());
|
||||||
setStatus(Error);
|
setStatus(NetworkError);
|
||||||
|
*error_during_obtaining = true;
|
||||||
return QList<Message>();
|
return QList<Message>();
|
||||||
}
|
}
|
||||||
else if (status() != NewMessages) {
|
else if (status() != NewMessages) {
|
||||||
setStatus(Normal);
|
setStatus(Normal);
|
||||||
|
*error_during_obtaining = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode downloaded data for further parsing.
|
// Encode downloaded data for further parsing.
|
||||||
|
@ -507,4 +509,6 @@ StandardFeed::StandardFeed(const QSqlRecord &record) : Feed(nullptr) {
|
||||||
|
|
||||||
setAutoUpdateType(static_cast<Feed::AutoUpdateType>(record.value(FDS_DB_UPDATE_TYPE_INDEX).toInt()));
|
setAutoUpdateType(static_cast<Feed::AutoUpdateType>(record.value(FDS_DB_UPDATE_TYPE_INDEX).toInt()));
|
||||||
setAutoUpdateInitialInterval(record.value(FDS_DB_UPDATE_INTERVAL_INDEX).toInt());
|
setAutoUpdateInitialInterval(record.value(FDS_DB_UPDATE_INTERVAL_INDEX).toInt());
|
||||||
|
|
||||||
|
m_networkError = QNetworkReply::NoError;
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,7 +142,7 @@ class StandardFeed : public Feed {
|
||||||
void fetchMetadataForItself();
|
void fetchMetadataForItself();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<Message> obtainNewMessages();
|
QList<Message> obtainNewMessages(bool *error_during_obtaining);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_passwordProtected;
|
bool m_passwordProtected;
|
||||||
|
|
|
@ -156,7 +156,7 @@ bool TtRssFeed::editItself(TtRssFeed *new_feed_data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Message> TtRssFeed::obtainNewMessages() {
|
QList<Message> TtRssFeed::obtainNewMessages(bool *error_during_obtaining) {
|
||||||
QList<Message> messages;
|
QList<Message> messages;
|
||||||
int newly_added_messages = 0;
|
int newly_added_messages = 0;
|
||||||
int limit = MAX_MESSAGES;
|
int limit = MAX_MESSAGES;
|
||||||
|
@ -167,7 +167,8 @@ QList<Message> TtRssFeed::obtainNewMessages() {
|
||||||
true, true, false);
|
true, true, false);
|
||||||
|
|
||||||
if (serviceRoot()->network()->lastError() != QNetworkReply::NoError) {
|
if (serviceRoot()->network()->lastError() != QNetworkReply::NoError) {
|
||||||
setStatus(Feed::Error);
|
setStatus(Feed::NetworkError);
|
||||||
|
*error_during_obtaining = true;
|
||||||
serviceRoot()->itemChanged(QList<RootItem*>() << this);
|
serviceRoot()->itemChanged(QList<RootItem*>() << this);
|
||||||
return QList<Message>();
|
return QList<Message>();
|
||||||
}
|
}
|
||||||
|
@ -181,6 +182,7 @@ QList<Message> TtRssFeed::obtainNewMessages() {
|
||||||
}
|
}
|
||||||
while (newly_added_messages > 0);
|
while (newly_added_messages > 0);
|
||||||
|
|
||||||
|
*error_during_obtaining = false;
|
||||||
return messages;
|
return messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ class TtRssFeed : public Feed {
|
||||||
bool removeItself();
|
bool removeItself();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<Message> obtainNewMessages();
|
QList<Message> obtainNewMessages(bool *error_during_obtaining);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TTRSSFEED_H
|
#endif // TTRSSFEED_H
|
||||||
|
|
Loading…
Add table
Reference in a new issue