Simplyfiyng network api.
This commit is contained in:
parent
8a7ca6b289
commit
8f051db71b
@ -980,7 +980,7 @@ bool DatabaseQueries::overwriteOwnCloudAccount(QSqlDatabase db, const QString& u
|
|||||||
query.bindValue(QSL(":url"), url);
|
query.bindValue(QSL(":url"), url);
|
||||||
query.bindValue(QSL(":force_update"), force_server_side_feed_update ? 1 : 0);
|
query.bindValue(QSL(":force_update"), force_server_side_feed_update ? 1 : 0);
|
||||||
query.bindValue(QSL(":id"), account_id);
|
query.bindValue(QSL(":id"), account_id);
|
||||||
query.bindValue(QSL(":msg_limit"), batch_size <= 0 ? UNLIMITED_BATCH_SIZE : batch_size);
|
query.bindValue(QSL(":msg_limit"), batch_size <= 0 ? OWNCLOUD_UNLIMITED_BATCH_SIZE : batch_size);
|
||||||
|
|
||||||
if (query.exec()) {
|
if (query.exec()) {
|
||||||
return true;
|
return true;
|
||||||
@ -1003,7 +1003,7 @@ bool DatabaseQueries::createOwnCloudAccount(QSqlDatabase db, int id_to_assign, c
|
|||||||
q.bindValue(QSL(":password"), TextFactory::encrypt(password));
|
q.bindValue(QSL(":password"), TextFactory::encrypt(password));
|
||||||
q.bindValue(QSL(":url"), url);
|
q.bindValue(QSL(":url"), url);
|
||||||
q.bindValue(QSL(":force_update"), force_server_side_feed_update ? 1 : 0);
|
q.bindValue(QSL(":force_update"), force_server_side_feed_update ? 1 : 0);
|
||||||
q.bindValue(QSL(":msg_limit"), batch_size <= 0 ? UNLIMITED_BATCH_SIZE : batch_size);
|
q.bindValue(QSL(":msg_limit"), batch_size <= 0 ? OWNCLOUD_UNLIMITED_BATCH_SIZE : batch_size);
|
||||||
|
|
||||||
if (q.exec()) {
|
if (q.exec()) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -57,6 +57,13 @@ QStringList NetworkFactory::extractFeedLinksFromHtmlPage(const QUrl& url, const
|
|||||||
return feeds;
|
return feeds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPair<QByteArray, QByteArray> NetworkFactory::generateBasicAuthHeader(const QString& username, const QString& password) {
|
||||||
|
QString basic_value = username + ":" + password;
|
||||||
|
QString header_value = QString("Basic ") + QString(basic_value.toUtf8().toBase64());
|
||||||
|
|
||||||
|
return QPair<QByteArray, QByteArray>(HTTP_HEADERS_AUTHORIZATION, header_value.toLocal8Bit());
|
||||||
|
}
|
||||||
|
|
||||||
QString NetworkFactory::networkErrorText(QNetworkReply::NetworkError error_code) {
|
QString NetworkFactory::networkErrorText(QNetworkReply::NetworkError error_code) {
|
||||||
switch (error_code) {
|
switch (error_code) {
|
||||||
case QNetworkReply::ProtocolUnknownError:
|
case QNetworkReply::ProtocolUnknownError:
|
||||||
@ -164,23 +171,16 @@ QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList<QString>& u
|
|||||||
}
|
}
|
||||||
|
|
||||||
Downloader* NetworkFactory::performAsyncNetworkOperation(const QString& url, int timeout, const QByteArray& input_data,
|
Downloader* NetworkFactory::performAsyncNetworkOperation(const QString& url, int timeout, const QByteArray& input_data,
|
||||||
const QString& input_content_type,
|
|
||||||
QNetworkAccessManager::Operation operation,
|
QNetworkAccessManager::Operation operation,
|
||||||
|
QList<QPair<QByteArray, QByteArray>> additional_headers,
|
||||||
bool protected_contents, const QString& username,
|
bool protected_contents, const QString& username,
|
||||||
const QString& password, bool set_basic_header) {
|
const QString& password) {
|
||||||
Downloader* downloader = new Downloader();
|
Downloader* downloader = new Downloader();
|
||||||
|
|
||||||
QObject::connect(downloader, &Downloader::completed, downloader, &Downloader::deleteLater);
|
QObject::connect(downloader, &Downloader::completed, downloader, &Downloader::deleteLater);
|
||||||
|
|
||||||
if (!input_content_type.isEmpty()) {
|
foreach (const auto& header, additional_headers) {
|
||||||
downloader->appendRawHeader("Content-Type", input_content_type.toLocal8Bit());
|
downloader->appendRawHeader(header.first, header.second);
|
||||||
}
|
|
||||||
|
|
||||||
if (set_basic_header) {
|
|
||||||
QString basic_value = username + ":" + password;
|
|
||||||
QString header_value = QString("Basic ") + QString(basic_value.toUtf8().toBase64());
|
|
||||||
|
|
||||||
downloader->appendRawHeader(HTTP_HEADERS_AUTHORIZATION, header_value.toLocal8Bit());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
downloader->manipulateData(url, operation, input_data, timeout, protected_contents, username, password);
|
downloader->manipulateData(url, operation, input_data, timeout, protected_contents, username, password);
|
||||||
|
@ -38,6 +38,7 @@ class NetworkFactory {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
static QStringList extractFeedLinksFromHtmlPage(const QUrl& url, const QString& html);
|
static QStringList extractFeedLinksFromHtmlPage(const QUrl& url, const QString& html);
|
||||||
|
static QPair<QByteArray, QByteArray> generateBasicAuthHeader(const QString& username, const QString& password);
|
||||||
|
|
||||||
// Returns human readable text for given network error.
|
// Returns human readable text for given network error.
|
||||||
static QString networkErrorText(QNetworkReply::NetworkError error_code);
|
static QString networkErrorText(QNetworkReply::NetworkError error_code);
|
||||||
@ -45,11 +46,15 @@ class NetworkFactory {
|
|||||||
// Performs SYNCHRONOUS download if favicon for the site,
|
// Performs SYNCHRONOUS download if favicon for the site,
|
||||||
// given URL belongs to.
|
// given URL belongs to.
|
||||||
static QNetworkReply::NetworkError downloadIcon(const QList<QString>& urls, int timeout, QIcon& output);
|
static QNetworkReply::NetworkError downloadIcon(const QList<QString>& urls, int timeout, QIcon& output);
|
||||||
static Downloader* performAsyncNetworkOperation(const QString& url, int timeout, const QByteArray& input_data,
|
static Downloader* performAsyncNetworkOperation(const QString& url,
|
||||||
const QString& input_content_type,
|
int timeout,
|
||||||
|
const QByteArray& input_data,
|
||||||
QNetworkAccessManager::Operation operation,
|
QNetworkAccessManager::Operation operation,
|
||||||
bool protected_contents = false, const QString& username = QString(),
|
QList<QPair<QByteArray,
|
||||||
const QString& password = QString(), bool set_basic_header = false);
|
QByteArray>> additional_headers = QList<QPair<QByteArray, QByteArray>>(),
|
||||||
|
bool protected_contents = false,
|
||||||
|
const QString& username = QString(),
|
||||||
|
const QString& password = QString());
|
||||||
static NetworkResult performNetworkOperation(const QString& url, int timeout, const QByteArray& input_data,
|
static NetworkResult performNetworkOperation(const QString& url, int timeout, const QByteArray& input_data,
|
||||||
const QString& input_content_type, QByteArray& output,
|
const QString& input_content_type, QByteArray& output,
|
||||||
QNetworkAccessManager::Operation operation,
|
QNetworkAccessManager::Operation operation,
|
||||||
|
@ -19,10 +19,10 @@
|
|||||||
#ifndef OWNCLOUD_DEFINITIONS_H
|
#ifndef OWNCLOUD_DEFINITIONS_H
|
||||||
#define OWNCLOUD_DEFINITIONS_H
|
#define OWNCLOUD_DEFINITIONS_H
|
||||||
|
|
||||||
#define CONTENT_TYPE "application/json; charset=utf-8"
|
#define OWNCLOUD_CONTENT_TYPE_JSON "application/json; charset=utf-8"
|
||||||
#define API_VERSION "1.2"
|
#define OWNCLOUD_API_VERSION "1.2"
|
||||||
#define API_PATH "index.php/apps/news/api/v1-2/"
|
#define OWNCLOUD_API_PATH "index.php/apps/news/api/v1-2/"
|
||||||
#define MINIMAL_OC_VERSION "6.0.5"
|
#define OWNCLOUD_MIN_VERSION "6.0.5"
|
||||||
#define UNLIMITED_BATCH_SIZE -1
|
#define OWNCLOUD_UNLIMITED_BATCH_SIZE -1
|
||||||
|
|
||||||
#endif // OWNCLOUD_DEFINITIONS_H
|
#endif // OWNCLOUD_DEFINITIONS_H
|
||||||
|
@ -35,7 +35,7 @@ FormEditOwnCloudAccount::FormEditOwnCloudAccount(QWidget* parent)
|
|||||||
m_ui->m_lblTestResult->label()->setWordWrap(true);
|
m_ui->m_lblTestResult->label()->setWordWrap(true);
|
||||||
m_ui->m_lblServerSideUpdateInformation->setText(tr("Leaving this option on causes that updates "
|
m_ui->m_lblServerSideUpdateInformation->setText(tr("Leaving this option on causes that updates "
|
||||||
"of feeds will be probably much slower and may time-out often."));
|
"of feeds will be probably much slower and may time-out often."));
|
||||||
m_ui->m_lblDescription->setText(tr("Note that at least version %1 is required.").arg(MINIMAL_OC_VERSION));
|
m_ui->m_lblDescription->setText(tr("Note that at least version %1 is required.").arg(OWNCLOUD_MIN_VERSION));
|
||||||
m_ui->m_txtPassword->lineEdit()->setPlaceholderText(tr("Password for your ownCloud account"));
|
m_ui->m_txtPassword->lineEdit()->setPlaceholderText(tr("Password for your ownCloud account"));
|
||||||
m_ui->m_txtUsername->lineEdit()->setPlaceholderText(tr("Username for your ownCloud account"));
|
m_ui->m_txtUsername->lineEdit()->setPlaceholderText(tr("Username for your ownCloud account"));
|
||||||
m_ui->m_txtUrl->lineEdit()->setPlaceholderText(tr("URL of your ownCloud server, without any API path"));
|
m_ui->m_txtUrl->lineEdit()->setPlaceholderText(tr("URL of your ownCloud server, without any API path"));
|
||||||
@ -121,12 +121,12 @@ void FormEditOwnCloudAccount::performTest() {
|
|||||||
OwnCloudStatusResponse result = factory.status();
|
OwnCloudStatusResponse result = factory.status();
|
||||||
|
|
||||||
if (result.isLoaded()) {
|
if (result.isLoaded()) {
|
||||||
if (!SystemFactory::isVersionEqualOrNewer(result.version(), MINIMAL_OC_VERSION)) {
|
if (!SystemFactory::isVersionEqualOrNewer(result.version(), OWNCLOUD_MIN_VERSION)) {
|
||||||
m_ui->m_lblTestResult->setStatus(WidgetWithStatus::Error,
|
m_ui->m_lblTestResult->setStatus(WidgetWithStatus::Error,
|
||||||
tr(
|
tr(
|
||||||
"Selected ownCloud News server is running unsupported version (%1). At least version %2 is required.").arg(
|
"Selected ownCloud News server is running unsupported version (%1). At least version %2 is required.").arg(
|
||||||
result.version(),
|
result.version(),
|
||||||
MINIMAL_OC_VERSION),
|
OWNCLOUD_MIN_VERSION),
|
||||||
tr("Selected ownCloud News server is running unsupported version."));
|
tr("Selected ownCloud News server is running unsupported version."));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -134,7 +134,7 @@ void FormEditOwnCloudAccount::performTest() {
|
|||||||
tr(
|
tr(
|
||||||
"ownCloud News server is okay, running with version %1, while at least version %2 is required.").arg(
|
"ownCloud News server is okay, running with version %1, while at least version %2 is required.").arg(
|
||||||
result.version(),
|
result.version(),
|
||||||
MINIMAL_OC_VERSION),
|
OWNCLOUD_MIN_VERSION),
|
||||||
tr("ownCloud News server is okay."));
|
tr("ownCloud News server is okay."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,8 @@
|
|||||||
|
|
||||||
OwnCloudNetworkFactory::OwnCloudNetworkFactory()
|
OwnCloudNetworkFactory::OwnCloudNetworkFactory()
|
||||||
: m_url(QString()), m_fixedUrl(QString()), m_forceServerSideUpdate(false),
|
: m_url(QString()), m_fixedUrl(QString()), m_forceServerSideUpdate(false),
|
||||||
m_authUsername(QString()), m_authPassword(QString()), m_batchSize(UNLIMITED_BATCH_SIZE), m_urlUser(QString()), m_urlStatus(QString()),
|
m_authUsername(QString()), m_authPassword(QString()), m_batchSize(OWNCLOUD_UNLIMITED_BATCH_SIZE), m_urlUser(QString()), m_urlStatus(
|
||||||
|
QString()),
|
||||||
m_urlFolders(QString()), m_urlFeeds(QString()), m_urlMessages(QString()), m_urlFeedsUpdate(QString()),
|
m_urlFolders(QString()), m_urlFeeds(QString()), m_urlMessages(QString()), m_urlFeedsUpdate(QString()),
|
||||||
m_urlDeleteFeed(QString()), m_urlRenameFeed(QString()), m_userId(QString()) {}
|
m_urlDeleteFeed(QString()), m_urlRenameFeed(QString()), m_userId(QString()) {}
|
||||||
|
|
||||||
@ -55,14 +56,14 @@ void OwnCloudNetworkFactory::setUrl(const QString& url) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Store endpoints.
|
// Store endpoints.
|
||||||
m_urlUser = m_fixedUrl + API_PATH + "user";
|
m_urlUser = m_fixedUrl + OWNCLOUD_API_PATH + "user";
|
||||||
m_urlStatus = m_fixedUrl + API_PATH + "status";
|
m_urlStatus = m_fixedUrl + OWNCLOUD_API_PATH + "status";
|
||||||
m_urlFolders = m_fixedUrl + API_PATH + "folders";
|
m_urlFolders = m_fixedUrl + OWNCLOUD_API_PATH + "folders";
|
||||||
m_urlFeeds = m_fixedUrl + API_PATH + "feeds";
|
m_urlFeeds = m_fixedUrl + OWNCLOUD_API_PATH + "feeds";
|
||||||
m_urlMessages = m_fixedUrl + API_PATH + "items?id=%1&batchSize=%2&type=%3";
|
m_urlMessages = m_fixedUrl + OWNCLOUD_API_PATH + "items?id=%1&batchSize=%2&type=%3";
|
||||||
m_urlFeedsUpdate = m_fixedUrl + API_PATH + "feeds/update?userId=%1&feedId=%2";
|
m_urlFeedsUpdate = m_fixedUrl + OWNCLOUD_API_PATH + "feeds/update?userId=%1&feedId=%2";
|
||||||
m_urlDeleteFeed = m_fixedUrl + API_PATH + "feeds/%1";
|
m_urlDeleteFeed = m_fixedUrl + OWNCLOUD_API_PATH + "feeds/%1";
|
||||||
m_urlRenameFeed = m_fixedUrl + API_PATH + "feeds/%1/rename";
|
m_urlRenameFeed = m_fixedUrl + OWNCLOUD_API_PATH + "feeds/%1/rename";
|
||||||
setUserId(QString());
|
setUserId(QString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,10 +313,10 @@ void OwnCloudNetworkFactory::markMessagesRead(RootItem::ReadStatus status, const
|
|||||||
QString final_url;
|
QString final_url;
|
||||||
|
|
||||||
if (status == RootItem::Read) {
|
if (status == RootItem::Read) {
|
||||||
final_url = m_fixedUrl + API_PATH + "items/read/multiple";
|
final_url = m_fixedUrl + OWNCLOUD_API_PATH + "items/read/multiple";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
final_url = m_fixedUrl + API_PATH + "items/unread/multiple";
|
final_url = m_fixedUrl + OWNCLOUD_API_PATH + "items/unread/multiple";
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (const QString& id, custom_ids) {
|
foreach (const QString& id, custom_ids) {
|
||||||
@ -324,14 +325,16 @@ void OwnCloudNetworkFactory::markMessagesRead(RootItem::ReadStatus status, const
|
|||||||
|
|
||||||
json["items"] = ids;
|
json["items"] = ids;
|
||||||
|
|
||||||
|
QList<QPair<QByteArray, QByteArray>> headers;
|
||||||
|
headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON);
|
||||||
|
headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword);
|
||||||
|
|
||||||
NetworkFactory::performAsyncNetworkOperation(final_url,
|
NetworkFactory::performAsyncNetworkOperation(final_url,
|
||||||
qApp->settings()->value(GROUP(Feeds),
|
qApp->settings()->value(GROUP(Feeds),
|
||||||
SETTING(Feeds::UpdateTimeout)).toInt(),
|
SETTING(Feeds::UpdateTimeout)).toInt(),
|
||||||
QJsonDocument(json).toJson(QJsonDocument::Compact),
|
QJsonDocument(json).toJson(QJsonDocument::Compact),
|
||||||
CONTENT_TYPE,
|
|
||||||
QNetworkAccessManager::PutOperation,
|
QNetworkAccessManager::PutOperation,
|
||||||
true, m_authUsername, m_authPassword,
|
headers);
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OwnCloudNetworkFactory::markMessagesStarred(RootItem::Importance importance,
|
void OwnCloudNetworkFactory::markMessagesStarred(RootItem::Importance importance,
|
||||||
@ -342,10 +345,10 @@ void OwnCloudNetworkFactory::markMessagesStarred(RootItem::Importance importance
|
|||||||
QString final_url;
|
QString final_url;
|
||||||
|
|
||||||
if (importance == RootItem::Important) {
|
if (importance == RootItem::Important) {
|
||||||
final_url = m_fixedUrl + API_PATH + "items/star/multiple";
|
final_url = m_fixedUrl + OWNCLOUD_API_PATH + "items/star/multiple";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
final_url = m_fixedUrl + API_PATH + "items/unstar/multiple";
|
final_url = m_fixedUrl + OWNCLOUD_API_PATH + "items/unstar/multiple";
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < feed_ids.size(); i++) {
|
for (int i = 0; i < feed_ids.size(); i++) {
|
||||||
@ -358,14 +361,16 @@ void OwnCloudNetworkFactory::markMessagesStarred(RootItem::Importance importance
|
|||||||
|
|
||||||
json["items"] = ids;
|
json["items"] = ids;
|
||||||
|
|
||||||
|
QList<QPair<QByteArray, QByteArray>> headers;
|
||||||
|
headers << QPair<QByteArray, QByteArray>(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON);
|
||||||
|
headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword);
|
||||||
|
|
||||||
NetworkFactory::performAsyncNetworkOperation(final_url,
|
NetworkFactory::performAsyncNetworkOperation(final_url,
|
||||||
qApp->settings()->value(GROUP(Feeds),
|
qApp->settings()->value(GROUP(Feeds),
|
||||||
SETTING(Feeds::UpdateTimeout)).toInt(),
|
SETTING(Feeds::UpdateTimeout)).toInt(),
|
||||||
QJsonDocument(json).toJson(QJsonDocument::Compact),
|
QJsonDocument(json).toJson(QJsonDocument::Compact),
|
||||||
CONTENT_TYPE,
|
|
||||||
QNetworkAccessManager::PutOperation,
|
QNetworkAccessManager::PutOperation,
|
||||||
true, m_authUsername, m_authPassword,
|
headers);
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int OwnCloudNetworkFactory::batchSize() const {
|
int OwnCloudNetworkFactory::batchSize() const {
|
||||||
|
@ -52,7 +52,7 @@ QString OwnCloudServiceEntryPoint::code() const {
|
|||||||
|
|
||||||
QString OwnCloudServiceEntryPoint::description() const {
|
QString OwnCloudServiceEntryPoint::description() const {
|
||||||
return QObject::tr("The News app is an RSS/Atom feed aggregator. It is part of Nextcloud suite. This plugin implements %1 API.")
|
return QObject::tr("The News app is an RSS/Atom feed aggregator. It is part of Nextcloud suite. This plugin implements %1 API.")
|
||||||
.arg(API_VERSION);
|
.arg(OWNCLOUD_API_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString OwnCloudServiceEntryPoint::author() const {
|
QString OwnCloudServiceEntryPoint::author() const {
|
||||||
|
@ -182,7 +182,8 @@ QPair<StandardFeed*, QNetworkReply::NetworkError> StandardFeed::guessFeed(const
|
|||||||
QNetworkAccessManager::GetOperation,
|
QNetworkAccessManager::GetOperation,
|
||||||
!username.isEmpty(),
|
!username.isEmpty(),
|
||||||
username,
|
username,
|
||||||
password);
|
password,
|
||||||
|
true);
|
||||||
|
|
||||||
result.second = network_result.first;
|
result.second = network_result.first;
|
||||||
|
|
||||||
@ -442,7 +443,8 @@ QList<Message> StandardFeed::obtainNewMessages(bool* error_during_obtaining) {
|
|||||||
QNetworkAccessManager::GetOperation,
|
QNetworkAccessManager::GetOperation,
|
||||||
!username().isEmpty(),
|
!username().isEmpty(),
|
||||||
username(),
|
username(),
|
||||||
password()).first;
|
password(),
|
||||||
|
true).first;
|
||||||
|
|
||||||
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());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user