From 8586c6c9e3cbc895dabff089b9df08454b4c86a4 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Tue, 19 Apr 2016 10:02:55 +0200 Subject: [PATCH] Network operations refactored. JSON usage refactored a bit. --- src/miscellaneous/systemfactory.cpp | 6 +- src/network-web/downloader.cpp | 9 +- src/network-web/downloader.h | 4 + src/network-web/networkfactory.cpp | 61 +----- src/network-web/networkfactory.h | 20 +- .../owncloud/gui/formeditowncloudaccount.ui | 2 +- .../owncloud/gui/formeditowncloudfeed.cpp | 26 +++ .../owncloud/gui/formeditowncloudfeed.h | 1 + .../owncloud/gui/formeditowncloudfeed.ui | 2 +- .../network/owncloudnetworkfactory.cpp | 176 +++++++++++------- .../owncloud/network/owncloudnetworkfactory.h | 3 + src/services/owncloud/owncloudserviceroot.cpp | 19 +- src/services/tt-rss/gui/formeditaccount.ui | 2 +- src/services/tt-rss/gui/formeditfeed.ui | 2 +- .../tt-rss/network/ttrssnetworkfactory.cpp | 28 +-- 15 files changed, 197 insertions(+), 164 deletions(-) diff --git a/src/miscellaneous/systemfactory.cpp b/src/miscellaneous/systemfactory.cpp index ad4a74697..ab6206aa0 100755 --- a/src/miscellaneous/systemfactory.cpp +++ b/src/miscellaneous/systemfactory.cpp @@ -191,8 +191,10 @@ QPair SystemFactory::checkForUpdates() QByteArray releases_xml; QByteArray changelog; - result.second = NetworkFactory::downloadFile(RELEASES_LIST, DOWNLOAD_TIMEOUT, releases_xml).first; - NetworkFactory::downloadFile(CHANGELOG, DOWNLOAD_TIMEOUT, changelog).first; + result.second = NetworkFactory::performNetworkOperation(RELEASES_LIST, DOWNLOAD_TIMEOUT, QByteArray(), QString(), + releases_xml, QNetworkAccessManager::GetOperation).first; + NetworkFactory::performNetworkOperation(CHANGELOG, DOWNLOAD_TIMEOUT, QByteArray(), QString(), changelog, + QNetworkAccessManager::GetOperation); if (result.second == QNetworkReply::NoError) { result.first = parseUpdatesFile(releases_xml, changelog); diff --git a/src/network-web/downloader.cpp b/src/network-web/downloader.cpp index 935a80b8f..c94205351 100755 --- a/src/network-web/downloader.cpp +++ b/src/network-web/downloader.cpp @@ -43,6 +43,11 @@ void Downloader::downloadFile(const QString &url, int timeout, bool protected_co protected_contents, username, password); } +void Downloader::uploadFile(const QString &url, const QByteArray &data, int timeout, + bool protected_contents, const QString &username, const QString &password) { + manipulateData(url, QNetworkAccessManager::PostOperation, data, timeout, protected_contents, username, password); +} + void Downloader::manipulateData(const QString &url, QNetworkAccessManager::Operation operation, const QByteArray &data, int timeout, bool protected_contents, const QString &username, const QString &password) { QNetworkRequest request; @@ -202,7 +207,9 @@ QVariant Downloader::lastContentType() const { } void Downloader::appendRawHeader(const QByteArray &name, const QByteArray &value) { - m_customHeaders.insert(name, value); + if (!value.isEmpty()) { + m_customHeaders.insert(name, value); + } } QNetworkReply::NetworkError Downloader::lastOutputError() const { diff --git a/src/network-web/downloader.h b/src/network-web/downloader.h index 2ca814708..54f40c8bd 100755 --- a/src/network-web/downloader.h +++ b/src/network-web/downloader.h @@ -49,6 +49,10 @@ class Downloader : public QObject { void downloadFile(const QString &url, int timeout = DOWNLOAD_TIMEOUT, bool protected_contents = false, const QString &username = QString(), const QString &password = QString()); + void uploadFile(const QString &url, const QByteArray &data, int timeout = DOWNLOAD_TIMEOUT, + bool protected_contents = false, const QString &username = QString(), + const QString &password = QString()); + // Performs asynchronous upload of given data as HTTP POST. // User needs to setup "Content-Encoding" header which // matches encoding of the data. diff --git a/src/network-web/networkfactory.cpp b/src/network-web/networkfactory.cpp index e66a23b84..96bf077d5 100755 --- a/src/network-web/networkfactory.cpp +++ b/src/network-web/networkfactory.cpp @@ -134,7 +134,8 @@ QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList &u foreach (const QString &url, urls) { const QString google_s2_with_url = QString("http://www.google.com/s2/favicons?domain=%1").arg(url.toHtmlEscaped()); QByteArray icon_data; - network_result = downloadFile(google_s2_with_url, timeout, icon_data).first; + network_result = performNetworkOperation(google_s2_with_url, timeout, QByteArray(), QString(), icon_data, + QNetworkAccessManager::GetOperation).first; if (network_result == QNetworkReply::NoError) { QPixmap icon_pixmap; @@ -147,7 +148,7 @@ QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList &u return network_result; } -NetworkResult NetworkFactory::uploadData(const QString &url, int timeout, const QByteArray &input_data, +NetworkResult NetworkFactory::performNetworkOperation(const QString &url, int timeout, const QByteArray &input_data, const QString &input_content_type, QByteArray &output, QNetworkAccessManager::Operation operation, bool protected_contents, const QString &username, const QString &password, bool set_basic_header) { @@ -200,59 +201,3 @@ NetworkResult NetworkFactory::downloadFeedFile(const QString &url, int timeout, return result; } - -NetworkResult NetworkFactory::downloadFile(const QString &url, int timeout, - QByteArray &output, bool protected_contents, - const QString &username, const QString &password, bool set_basic_header) { - // Here, we want to achieve "synchronous" approach because we want synchronous download API for - // some use-cases too. - Downloader downloader; - QEventLoop loop; - NetworkResult result; - - if (set_basic_header) { - QString basic_value = username + ":" + password; - QString header_value = QString("Basic ") + QString(basic_value.toUtf8().toBase64()); - - downloader.appendRawHeader("Authorization", header_value.toLocal8Bit()); - } - - // We need to quit event loop when the download finishes. - QObject::connect(&downloader, SIGNAL(completed(QNetworkReply::NetworkError)), &loop, SLOT(quit())); - - downloader.downloadFile(url, timeout, protected_contents, username, password); - loop.exec(); - output = downloader.lastOutputData(); - result.first = downloader.lastOutputError(); - result.second = downloader.lastContentType(); - - return result; -} - -NetworkResult NetworkFactory::deleteResource(const QString &url, int timeout, bool protected_contents, - const QString &username, const QString &password, bool set_basic_header) { - // Here, we want to achieve "synchronous" approach because we want synchronous download API for - // some use-cases too. - Downloader downloader; - QEventLoop loop; - NetworkResult result; - - if (set_basic_header) { - QString basic_value = username + ":" + password; - QString header_value = QString("Basic ") + QString(basic_value.toUtf8().toBase64()); - - downloader.appendRawHeader("Authorization", header_value.toLocal8Bit()); - } - - // We need to quit event loop when the download finishes. - QObject::connect(&downloader, SIGNAL(completed(QNetworkReply::NetworkError)), &loop, SLOT(quit())); - - downloader.manipulateData(url, QNetworkAccessManager::DeleteOperation, QByteArray(), - timeout, protected_contents, username, password); - loop.exec(); - - result.first = downloader.lastOutputError(); - result.second = downloader.lastContentType(); - - return result; -} diff --git a/src/network-web/networkfactory.h b/src/network-web/networkfactory.h index f1972337e..63b84f5ae 100755 --- a/src/network-web/networkfactory.h +++ b/src/network-web/networkfactory.h @@ -43,25 +43,15 @@ class NetworkFactory { // given URL belongs to. static QNetworkReply::NetworkError downloadIcon(const QList &urls, int timeout, QIcon &output); - static NetworkResult uploadData(const QString &url, int timeout, const QByteArray &input_data, - const QString &input_content_type, QByteArray &output, - QNetworkAccessManager::Operation operation, - bool protected_contents = false, const QString &username = QString(), - const QString &password = QString(), bool set_basic_header = false); + static NetworkResult performNetworkOperation(const QString &url, int timeout, const QByteArray &input_data, + const QString &input_content_type, QByteArray &output, + QNetworkAccessManager::Operation operation, + bool protected_contents = false, const QString &username = QString(), + const QString &password = QString(), bool set_basic_header = false); static NetworkResult downloadFeedFile(const QString &url, int timeout, QByteArray &output, bool protected_contents = false, const QString &username = QString(), const QString &password = QString()); - - // Performs SYNCHRONOUS download of file with given URL - // and given timeout. - static NetworkResult downloadFile(const QString &url, int timeout, QByteArray &output, - bool protected_contents = false, const QString &username = QString(), - const QString &password = QString(), bool set_basic_header = false); - - static NetworkResult deleteResource(const QString &url, int timeout, - bool protected_contents = false, const QString &username = QString(), - const QString &password = QString(), bool set_basic_header = false); }; #endif // NETWORKFACTORY_H diff --git a/src/services/owncloud/gui/formeditowncloudaccount.ui b/src/services/owncloud/gui/formeditowncloudaccount.ui index 28d20d467..de582a6a9 100755 --- a/src/services/owncloud/gui/formeditowncloudaccount.ui +++ b/src/services/owncloud/gui/formeditowncloudaccount.ui @@ -7,7 +7,7 @@ 0 0 541 - 273 + 301 diff --git a/src/services/owncloud/gui/formeditowncloudfeed.cpp b/src/services/owncloud/gui/formeditowncloudfeed.cpp index abbc6dea9..5f7b54145 100644 --- a/src/services/owncloud/gui/formeditowncloudfeed.cpp +++ b/src/services/owncloud/gui/formeditowncloudfeed.cpp @@ -96,6 +96,7 @@ void FormEditOwnCloudFeed::performAction() { } else { // TODO: Add new feed. + addNewFeed(); } accept(); @@ -204,6 +205,31 @@ void FormEditOwnCloudFeed::saveFeed() { delete new_feed_data; } +void FormEditOwnCloudFeed::addNewFeed() { + RootItem *parent = static_cast(m_ui->m_cmbParentCategory->itemData(m_ui->m_cmbParentCategory->currentIndex()).value()); + const int category_id = parent->kind() == RootItemKind::ServiceRoot ? 0 : parent->customId(); + + + /*const TtRssSubscribeToFeedResponse response = root->network()->subscribeToFeed(m_ui->m_txtUrl->lineEdit()->text(), + category_id, + m_ui->m_gbAuthentication->isChecked(), + m_ui->m_txtUsername->lineEdit()->text(), + m_ui->m_txtPassword->lineEdit()->text()); +*/ + /*if (response.code() == STF_INSERTED) { + // Feed was added online. + accept(); + qApp->showGuiMessage(tr("Feed added"), tr("Feed was added, triggering sync in now."), QSystemTrayIcon::Information); + QTimer::singleShot(100, root, SLOT(syncIn())); + } + else { + reject(); + qApp->showGuiMessage(tr("Cannot add feed"), + tr("Feed was not added due to error."), + QSystemTrayIcon::Critical, qApp->mainForm(), true); + }*/ +} + void FormEditOwnCloudFeed::loadCategories(const QList categories, RootItem *root_item) { m_ui->m_cmbParentCategory->addItem(root_item->icon(), root_item->title(), diff --git a/src/services/owncloud/gui/formeditowncloudfeed.h b/src/services/owncloud/gui/formeditowncloudfeed.h index 935a40a08..cecebf6bf 100644 --- a/src/services/owncloud/gui/formeditowncloudfeed.h +++ b/src/services/owncloud/gui/formeditowncloudfeed.h @@ -54,6 +54,7 @@ class FormEditOwnCloudFeed : public QDialog { void initialize(); void loadFeed(OwnCloudFeed *input_feed); void saveFeed(); + void addNewFeed(); void loadCategories(const QList categories, RootItem *root_item); QScopedPointer m_ui; diff --git a/src/services/owncloud/gui/formeditowncloudfeed.ui b/src/services/owncloud/gui/formeditowncloudfeed.ui index 45e766d9d..b311c9172 100644 --- a/src/services/owncloud/gui/formeditowncloudfeed.ui +++ b/src/services/owncloud/gui/formeditowncloudfeed.ui @@ -7,7 +7,7 @@ 0 0 598 - 235 + 266 diff --git a/src/services/owncloud/network/owncloudnetworkfactory.cpp b/src/services/owncloud/network/owncloudnetworkfactory.cpp index 61a433e04..27f380957 100755 --- a/src/services/owncloud/network/owncloudnetworkfactory.cpp +++ b/src/services/owncloud/network/owncloudnetworkfactory.cpp @@ -102,12 +102,13 @@ QNetworkReply::NetworkError OwnCloudNetworkFactory::lastError() const { OwnCloudUserResponse OwnCloudNetworkFactory::userInfo() { QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::downloadFile(m_urlUser, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - result_raw, - true, m_authUsername, m_authPassword, - true); + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlUser, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QByteArray(), QString(), result_raw, + QNetworkAccessManager::GetOperation, + true, m_authUsername, m_authPassword, + true); OwnCloudUserResponse user_response(QString::fromUtf8(result_raw)); if (network_reply.first != QNetworkReply::NoError) { @@ -120,12 +121,13 @@ OwnCloudUserResponse OwnCloudNetworkFactory::userInfo() { OwnCloudStatusResponse OwnCloudNetworkFactory::status() { QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::downloadFile(m_urlStatus, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - result_raw, - true, m_authUsername, m_authPassword, - true); + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlStatus, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QByteArray(), QString(), result_raw, + QNetworkAccessManager::GetOperation, + true, m_authUsername, m_authPassword, + true); OwnCloudStatusResponse status_response(QString::fromUtf8(result_raw)); if (network_reply.first != QNetworkReply::NoError) { @@ -138,12 +140,13 @@ OwnCloudStatusResponse OwnCloudNetworkFactory::status() { OwnCloudGetFeedsCategoriesResponse OwnCloudNetworkFactory::feedsCategories() { QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::downloadFile(m_urlFolders, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - result_raw, - true, m_authUsername, m_authPassword, - true); + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlFolders, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QByteArray(), QString(), result_raw, + QNetworkAccessManager::GetOperation, + true, m_authUsername, m_authPassword, + true); if (network_reply.first != QNetworkReply::NoError) { qWarning("ownCloud: Obtaining of categories failed with error %d.", network_reply.first); m_lastError = network_reply.first; @@ -154,12 +157,13 @@ OwnCloudGetFeedsCategoriesResponse OwnCloudNetworkFactory::feedsCategories() { QString content_categories = QString::fromUtf8(result_raw); // Now, obtain feeds. - network_reply = NetworkFactory::downloadFile(m_urlFeeds, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - result_raw, - true, m_authUsername, m_authPassword, - true); + network_reply = NetworkFactory::performNetworkOperation(m_urlFeeds, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QByteArray(), QString(), result_raw, + QNetworkAccessManager::GetOperation, + true, m_authUsername, m_authPassword, + true); if (network_reply.first != QNetworkReply::NoError) { qWarning("ownCloud: Obtaining of feeds failed with error %d.", network_reply.first); m_lastError = network_reply.first; @@ -174,10 +178,12 @@ OwnCloudGetFeedsCategoriesResponse OwnCloudNetworkFactory::feedsCategories() { bool OwnCloudNetworkFactory::deleteFeed(int feed_id) { QString final_url = m_urlDeleteFeed.arg(QString::number(feed_id)); - NetworkResult network_reply = NetworkFactory::deleteResource(final_url, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - true, m_authUsername, m_authPassword, true); + NetworkResult network_reply = NetworkFactory::performNetworkOperation(final_url, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QByteArray(), QString(), + QByteArray(), QNetworkAccessManager::DeleteOperation, + true, m_authUsername, m_authPassword, true); m_lastError = network_reply.first; @@ -190,6 +196,33 @@ bool OwnCloudNetworkFactory::deleteFeed(int feed_id) { } } +bool OwnCloudNetworkFactory::createFeed(const QString &url, int parent_id) { + QJsonObject json; + + json["url"] = url; + json["folderId"] = parent_id; + + QByteArray result_raw; + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlFeeds, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QJsonDocument(json).toJson(QJsonDocument::Compact), + QSL("application/json"), + result_raw, + QNetworkAccessManager::PostOperation, + true, m_authUsername, m_authPassword, true); + + m_lastError = network_reply.first; + + if (network_reply.first != QNetworkReply::NoError) { + qWarning("ownCloud: Creating of category failed with error %d.", network_reply.first); + return false; + } + else { + return true; + } +} + OwnCloudGetMessagesResponse OwnCloudNetworkFactory::getMessages(int feed_id) { if (forceServerSideUpdate()) { triggerFeedUpdate(feed_id); @@ -199,12 +232,13 @@ OwnCloudGetMessagesResponse OwnCloudNetworkFactory::getMessages(int feed_id) { QString::number(-1), QString::number(0)); QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::downloadFile(final_url, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - result_raw, - true, m_authUsername, m_authPassword, - true); + NetworkResult network_reply = NetworkFactory::performNetworkOperation(final_url, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QByteArray(), QString(), result_raw, + QNetworkAccessManager::GetOperation, + true, m_authUsername, m_authPassword, + true); OwnCloudGetMessagesResponse msgs_response(QString::fromUtf8(result_raw)); if (network_reply.first != QNetworkReply::NoError) { @@ -231,13 +265,14 @@ QNetworkReply::NetworkError OwnCloudNetworkFactory::triggerFeedUpdate(int feed_i // Now, we can trigger the update. QByteArray raw_output; - NetworkResult network_reply = NetworkFactory::downloadFile(m_urlFeedsUpdate.arg(userId(), - QString::number(feed_id)), - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - raw_output, - true, m_authUsername, m_authPassword, - true); + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlFeedsUpdate.arg(userId(), + QString::number(feed_id)), + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QByteArray(), QString(), raw_output, + QNetworkAccessManager::GetOperation, + true, m_authUsername, m_authPassword, + true); if (network_reply.first != QNetworkReply::NoError) { qWarning("ownCloud: Feeds update failed with error %d.", network_reply.first); @@ -263,21 +298,20 @@ QNetworkReply::NetworkError OwnCloudNetworkFactory::markMessagesRead(RootItem::R } foreach (const QString &id, custom_ids) { - var_ids.append(id.toInt()); + ids.append(QJsonValue(id.toInt())); } - ids.append(QJsonArray::fromVariantList(var_ids)); json["items"] = ids; - NetworkResult network_reply = NetworkFactory::uploadData(final_url, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - QJsonDocument(json).toJson(QJsonDocument::Compact), - "application/json", - raw_output, - QNetworkAccessManager::PutOperation, - true, m_authUsername, m_authPassword, - true); + NetworkResult network_reply = NetworkFactory::performNetworkOperation(final_url, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QJsonDocument(json).toJson(QJsonDocument::Compact), + QSL("application/json"), + raw_output, + QNetworkAccessManager::PutOperation, + true, m_authUsername, m_authPassword, + true); if (network_reply.first != QNetworkReply::NoError) { qWarning("ownCloud: Marking messages as (un)read failed with error %d.", network_reply.first); @@ -303,24 +337,24 @@ QNetworkReply::NetworkError OwnCloudNetworkFactory::markMessagesStarred(RootItem } for (int i = 0; i < feed_ids.size(); i++) { - QVariantMap item; - item.insert(QSL("feedId"), feed_ids.at(i)); - item.insert(QSL("guidHash"), guid_hashes.at(i)); + QJsonObject item; + item["feedId"] = feed_ids.at(i); + item["guidHash"] = guid_hashes.at(i); - ids.append(QJsonValue::fromVariant(item)); + ids.append(item); } json["items"] = ids; - NetworkResult network_reply = NetworkFactory::uploadData(final_url, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - QJsonDocument(json).toJson(QJsonDocument::Compact), - "application/json", - raw_output, - QNetworkAccessManager::PutOperation, - true, m_authUsername, m_authPassword, - true); + NetworkResult network_reply = NetworkFactory::performNetworkOperation(final_url, + qApp->settings()->value(GROUP(Feeds), + SETTING(Feeds::UpdateTimeout)).toInt(), + QJsonDocument(json).toJson(QJsonDocument::Compact), + "application/json", + raw_output, + QNetworkAccessManager::PutOperation, + true, m_authUsername, m_authPassword, + true); if (network_reply.first != QNetworkReply::NoError) { qWarning("ownCloud: Marking messages as (un)starred failed with error %d.", network_reply.first); @@ -440,8 +474,8 @@ RootItem *OwnCloudGetFeedsCategoriesResponse::feedsCategories(bool obtain_icons) cats.insert(0, parent); // Process categories first, then process feeds. - foreach (QVariant cat, QJsonDocument::fromJson(m_contentCategories.toUtf8()).object()["folders"].toArray().toVariantList()) { - QMap item = cat.toMap(); + foreach (QJsonValue cat, QJsonDocument::fromJson(m_contentCategories.toUtf8()).object()["folders"].toArray()) { + QJsonObject item = cat.toObject(); OwnCloudCategory *category = new OwnCloudCategory(); category->setTitle(item["name"].toString()); @@ -454,8 +488,8 @@ RootItem *OwnCloudGetFeedsCategoriesResponse::feedsCategories(bool obtain_icons) } // We have categories added, now add all feeds. - foreach (QVariant fed, QJsonDocument::fromJson(m_contentFeeds.toUtf8()).object()["feeds"].toArray().toVariantList()) { - QMap item = fed.toMap(); + foreach (QJsonValue fed, QJsonDocument::fromJson(m_contentFeeds.toUtf8()).object()["feeds"].toArray()) { + QJsonObject item = fed.toObject(); OwnCloudFeed *feed = new OwnCloudFeed(); if (obtain_icons) { @@ -464,7 +498,9 @@ RootItem *OwnCloudGetFeedsCategoriesResponse::feedsCategories(bool obtain_icons) if (!icon_path.isEmpty()) { QByteArray icon_data; - if (NetworkFactory::downloadFile(icon_path, DOWNLOAD_TIMEOUT, icon_data).first == QNetworkReply::NoError) { + if (NetworkFactory::performNetworkOperation(icon_path, DOWNLOAD_TIMEOUT, + QByteArray(), QString(), icon_data, + QNetworkAccessManager::GetOperation).first == QNetworkReply::NoError) { // Icon downloaded, set it up. QPixmap icon_pixmap; icon_pixmap.loadFromData(icon_data); diff --git a/src/services/owncloud/network/owncloudnetworkfactory.h b/src/services/owncloud/network/owncloudnetworkfactory.h index 5418f1466..3695a66e1 100755 --- a/src/services/owncloud/network/owncloudnetworkfactory.h +++ b/src/services/owncloud/network/owncloudnetworkfactory.h @@ -122,6 +122,9 @@ class OwnCloudNetworkFactory { // Delete a feed. bool deleteFeed(int feed_id); + // Creates new feed. + bool createFeed(const QString &url, int parent_id); + // Get messages for given feed. OwnCloudGetMessagesResponse getMessages(int feed_id); diff --git a/src/services/owncloud/owncloudserviceroot.cpp b/src/services/owncloud/owncloudserviceroot.cpp index 329875809..59b7307ab 100755 --- a/src/services/owncloud/owncloudserviceroot.cpp +++ b/src/services/owncloud/owncloudserviceroot.cpp @@ -22,6 +22,7 @@ #include "miscellaneous/application.h" #include "miscellaneous/textfactory.h" #include "miscellaneous/iconfactory.h" +#include "miscellaneous/mutex.h" #include "gui/dialogs/formmain.h" #include "services/owncloud/owncloudserviceentrypoint.h" #include "services/owncloud/owncloudrecyclebin.h" @@ -29,6 +30,7 @@ #include "services/owncloud/owncloudcategory.h" #include "services/owncloud/network/owncloudnetworkfactory.h" #include "services/owncloud/gui/formeditowncloudaccount.h" +#include "services/owncloud/gui/formeditowncloudfeed.h" OwnCloudServiceRoot::OwnCloudServiceRoot(RootItem *parent) @@ -68,7 +70,7 @@ bool OwnCloudServiceRoot::deleteViaGui() { } bool OwnCloudServiceRoot::supportsFeedAdding() const { - return false; + return true; } bool OwnCloudServiceRoot::supportsCategoryAdding() const { @@ -195,6 +197,21 @@ void OwnCloudServiceRoot::saveAccountDataToDatabase() { } void OwnCloudServiceRoot::addNewFeed(const QString &url) { + if (!qApp->feedUpdateLock()->tryLock()) { + // Lock was not obtained because + // it is used probably by feed updater or application + // is quitting. + qApp->showGuiMessage(tr("Cannot add item"), + tr("Cannot add feed because another critical operation is ongoing."), + QSystemTrayIcon::Warning, qApp->mainForm(), true); + // Thus, cannot delete and quit the method. + return; + } + + QScopedPointer form_pointer(new FormEditOwnCloudFeed(this, qApp->mainForm())); + + form_pointer.data()->execForAdd(url); + qApp->feedUpdateLock()->unlock(); } void OwnCloudServiceRoot::addNewCategory() { diff --git a/src/services/tt-rss/gui/formeditaccount.ui b/src/services/tt-rss/gui/formeditaccount.ui index 89b940531..e78b37ad9 100755 --- a/src/services/tt-rss/gui/formeditaccount.ui +++ b/src/services/tt-rss/gui/formeditaccount.ui @@ -7,7 +7,7 @@ 0 0 541 - 377 + 415 diff --git a/src/services/tt-rss/gui/formeditfeed.ui b/src/services/tt-rss/gui/formeditfeed.ui index 62db8b751..bc100f6a0 100755 --- a/src/services/tt-rss/gui/formeditfeed.ui +++ b/src/services/tt-rss/gui/formeditfeed.ui @@ -7,7 +7,7 @@ 0 0 598 - 235 + 263 diff --git a/src/services/tt-rss/network/ttrssnetworkfactory.cpp b/src/services/tt-rss/network/ttrssnetworkfactory.cpp index 44ed3cc35..2a6e75e0e 100755 --- a/src/services/tt-rss/network/ttrssnetworkfactory.cpp +++ b/src/services/tt-rss/network/ttrssnetworkfactory.cpp @@ -87,7 +87,7 @@ TtRssLoginResponse TtRssNetworkFactory::login() { json["password"] = m_password; QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::uploadData(m_url, qApp->settings()->value(GROUP(Feeds), + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_url, qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(), QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, @@ -114,7 +114,7 @@ TtRssResponse TtRssNetworkFactory::logout() { json["sid"] = m_sessionId; QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::uploadData(m_url, qApp->settings()->value(GROUP(Feeds), + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_url, qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(), QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, @@ -147,7 +147,7 @@ TtRssGetFeedsCategoriesResponse TtRssNetworkFactory::getFeedsCategories() { const int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); @@ -158,7 +158,7 @@ TtRssGetFeedsCategoriesResponse TtRssNetworkFactory::getFeedsCategories() { login(); json["sid"] = m_sessionId; - network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, + network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); result = TtRssGetFeedsCategoriesResponse(QString::fromUtf8(result_raw)); @@ -188,7 +188,7 @@ TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, int lim const int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); @@ -199,7 +199,7 @@ TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, int lim login(); json["sid"] = m_sessionId; - network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, + network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); result = TtRssGetHeadlinesResponse(QString::fromUtf8(result_raw)); @@ -225,7 +225,7 @@ TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList const int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); @@ -236,7 +236,7 @@ TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList login(); json["sid"] = m_sessionId; - network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), + network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); @@ -267,7 +267,7 @@ TtRssSubscribeToFeedResponse TtRssNetworkFactory::subscribeToFeed(const QString const int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); @@ -278,7 +278,7 @@ TtRssSubscribeToFeedResponse TtRssNetworkFactory::subscribeToFeed(const QString login(); json["sid"] = m_sessionId; - network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), + network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); @@ -301,7 +301,7 @@ TtRssUnsubscribeFeedResponse TtRssNetworkFactory::unsubscribeFeed(int feed_id) { const int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); QByteArray result_raw; - NetworkResult network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); TtRssUnsubscribeFeedResponse result(QString::fromUtf8(result_raw)); @@ -311,7 +311,7 @@ TtRssUnsubscribeFeedResponse TtRssNetworkFactory::unsubscribeFeed(int feed_id) { login(); json["sid"] = m_sessionId; - network_reply = NetworkFactory::uploadData(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, + network_reply = NetworkFactory::performNetworkOperation(m_url, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), CONTENT_TYPE, result_raw, QNetworkAccessManager::PostOperation, m_authIsUsed, m_authUsername, m_authPassword); result = TtRssUnsubscribeFeedResponse(QString::fromUtf8(result_raw)); @@ -505,7 +505,9 @@ RootItem *TtRssGetFeedsCategoriesResponse::feedsCategories(bool obtain_icons, QS QString full_icon_address = base_address + QL1C('/') + icon_path; QByteArray icon_data; - if (NetworkFactory::downloadFile(full_icon_address, DOWNLOAD_TIMEOUT, icon_data).first == QNetworkReply::NoError) { + if (NetworkFactory::performNetworkOperation(full_icon_address, DOWNLOAD_TIMEOUT, + QByteArray(), QString(), icon_data, + QNetworkAccessManager::GetOperation).first == QNetworkReply::NoError) { // Icon downloaded, set it up. QPixmap icon_pixmap; icon_pixmap.loadFromData(icon_data);