Added appdata.xml, screenshots and work on Gmail plugin.

This commit is contained in:
Martin Rotter 2017-10-18 10:45:14 +02:00
parent 1aef34a4e5
commit 5998ebdb9f
16 changed files with 300 additions and 202 deletions

37
resources/desktop/appdata.xml Executable file
View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2017 Martin Rotter <rotter.martinos@gmail.com> -->
<component type="desktop-application">
<id>com.github.rssguard</id>
<metadata_license>GPL-3.0</metadata_license>
<project_license>GPL-3.0</project_license>
<name>RSS Guard </name>
<summary>Simple (yet powerful) feed reader</summary>
<description>
<p>
RSS Guard is simple (yet powerful) feed reader. It is able to fetch the most known feed formats, including RSS/RDF and ATOM. RSS Guard is developed on top of the Qt library
</p>
</description>
<launchable type="desktop-id">rssguard.desktop</launchable>
<screenshots>
<screenshot type="default">
<caption>Linux version</caption>
<image>http://www.hughsie.com/en_US/main.png</image>
</screenshot>
<screenshot>
<caption>Windows version</caption>
<image>http://www.hughsie.com/en_US/main.png</image>
</screenshot>
</screenshots>
<url type="homepage">http://www.gnome.org/projects/en_US/gnome-power-manager</url>
<project_group>GNOME</project_group>
<provides>
<binary>gnome-power-statistics</binary>
</provides>
<releases>
<release version="3.12.2" date="2013-04-12">
<description>
<p>Fixes issues X, Y and Z</p>
</description>
</release>
</releases>
</component>

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

View file

@ -217,6 +217,8 @@ HEADERS += src/core/feeddownloader.h \
src/core/feedsproxymodel.h \
src/core/message.h \
src/core/messagesmodel.h \
src/core/messagesmodelcache.h \
src/core/messagesmodelsqllayer.h \
src/core/messagesproxymodel.h \
src/definitions/definitions.h \
src/dynamic-shortcuts/dynamicshortcuts.h \
@ -241,6 +243,7 @@ HEADERS += src/core/feeddownloader.h \
src/gui/feedmessageviewer.h \
src/gui/feedstoolbar.h \
src/gui/feedsview.h \
src/gui/guiutilities.h \
src/gui/labelwithstatus.h \
src/gui/lineeditwithstatus.h \
src/gui/messagebox.h \
@ -248,6 +251,15 @@ HEADERS += src/core/feeddownloader.h \
src/gui/messagestoolbar.h \
src/gui/messagesview.h \
src/gui/plaintoolbutton.h \
src/gui/settings/settingsbrowsermail.h \
src/gui/settings/settingsdatabase.h \
src/gui/settings/settingsdownloads.h \
src/gui/settings/settingsfeedsmessages.h \
src/gui/settings/settingsgeneral.h \
src/gui/settings/settingsgui.h \
src/gui/settings/settingslocalization.h \
src/gui/settings/settingspanel.h \
src/gui/settings/settingsshortcuts.h \
src/gui/squeezelabel.h \
src/gui/statusbar.h \
src/gui/styleditemdelegatewithoutfocus.h \
@ -257,6 +269,7 @@ HEADERS += src/core/feeddownloader.h \
src/gui/tabwidget.h \
src/gui/timespinbox.h \
src/gui/toolbareditor.h \
src/gui/treeviewcolumnsmenu.h \
src/gui/widgetwithstatus.h \
src/miscellaneous/application.h \
src/miscellaneous/autosaver.h \
@ -264,6 +277,8 @@ HEADERS += src/core/feeddownloader.h \
src/miscellaneous/databasefactory.h \
src/miscellaneous/databasequeries.h \
src/miscellaneous/debugging.h \
src/miscellaneous/externaltool.h \
src/miscellaneous/feedreader.h \
src/miscellaneous/iconfactory.h \
src/miscellaneous/iofactory.h \
src/miscellaneous/localization.h \
@ -278,6 +293,7 @@ HEADERS += src/core/feeddownloader.h \
src/network-web/downloader.h \
src/network-web/downloadmanager.h \
src/network-web/networkfactory.h \
src/network-web/oauth2service.h \
src/network-web/silentnetworkaccessmanager.h \
src/network-web/webfactory.h \
src/qtsingleapplication/qtlocalpeer.h \
@ -285,6 +301,7 @@ HEADERS += src/core/feeddownloader.h \
src/qtsingleapplication/qtsingleapplication.h \
src/qtsingleapplication/qtsinglecoreapplication.h \
src/services/abstract/accountcheckmodel.h \
src/services/abstract/cacheforserviceroot.h \
src/services/abstract/category.h \
src/services/abstract/feed.h \
src/services/abstract/gui/formfeeddetails.h \
@ -292,6 +309,18 @@ HEADERS += src/core/feeddownloader.h \
src/services/abstract/rootitem.h \
src/services/abstract/serviceentrypoint.h \
src/services/abstract/serviceroot.h \
src/services/gmail/definitions.h \
src/services/gmail/gmailentrypoint.h \
src/services/gmail/gmailfeed.h \
src/services/gmail/gmailserviceroot.h \
src/services/gmail/gui/formeditgmailaccount.h \
src/services/gmail/network/gmailnetworkfactory.h \
src/services/inoreader/definitions.h \
src/services/inoreader/gui/formeditinoreaderaccount.h \
src/services/inoreader/inoreaderentrypoint.h \
src/services/inoreader/inoreaderfeed.h \
src/services/inoreader/inoreaderserviceroot.h \
src/services/inoreader/network/inoreadernetworkfactory.h \
src/services/owncloud/definitions.h \
src/services/owncloud/gui/formeditowncloudaccount.h \
src/services/owncloud/gui/formowncloudfeeddetails.h \
@ -299,47 +328,33 @@ HEADERS += src/core/feeddownloader.h \
src/services/owncloud/owncloudfeed.h \
src/services/owncloud/owncloudserviceentrypoint.h \
src/services/owncloud/owncloudserviceroot.h \
src/services/standard/atomparser.h \
src/services/standard/feedparser.h \
src/services/standard/gui/formstandardcategorydetails.h \
src/services/standard/gui/formstandardfeeddetails.h \
src/services/standard/gui/formstandardimportexport.h \
src/services/standard/rdfparser.h \
src/services/standard/rssparser.h \
src/services/standard/standardcategory.h \
src/services/standard/standardfeed.h \
src/services/standard/standardfeedsimportexportmodel.h \
src/services/standard/standardserviceentrypoint.h \
src/services/standard/standardserviceroot.h \
src/services/tt-rss/definitions.h \
src/services/tt-rss/gui/formeditttrssaccount.h \
src/services/tt-rss/gui/formttrssfeeddetails.h \
src/services/tt-rss/network/ttrssnetworkfactory.h \
src/services/tt-rss/ttrssfeed.h \
src/services/tt-rss/ttrssserviceentrypoint.h \
src/services/tt-rss/ttrssserviceroot.h \
src/gui/settings/settingspanel.h \
src/gui/settings/settingsgeneral.h \
src/gui/settings/settingsdatabase.h \
src/gui/settings/settingsshortcuts.h \
src/gui/settings/settingsgui.h \
src/gui/settings/settingslocalization.h \
src/gui/settings/settingsbrowsermail.h \
src/gui/settings/settingsfeedsmessages.h \
src/gui/settings/settingsdownloads.h \
src/miscellaneous/feedreader.h \
src/services/standard/atomparser.h \
src/services/standard/feedparser.h \
src/services/standard/rdfparser.h \
src/services/standard/rssparser.h \
src/services/abstract/cacheforserviceroot.h \
src/services/tt-rss/gui/formeditttrssaccount.h \
src/gui/guiutilities.h \
src/core/messagesmodelcache.h \
src/core/messagesmodelsqllayer.h \
src/gui/treeviewcolumnsmenu.h \
src/miscellaneous/externaltool.h
src/services/tt-rss/ttrssserviceroot.h
SOURCES += src/core/feeddownloader.cpp \
src/core/feedsmodel.cpp \
src/core/feedsproxymodel.cpp \
src/core/message.cpp \
src/core/messagesmodel.cpp \
src/core/messagesmodelcache.cpp \
src/core/messagesmodelsqllayer.cpp \
src/core/messagesproxymodel.cpp \
src/dynamic-shortcuts/dynamicshortcuts.cpp \
src/dynamic-shortcuts/dynamicshortcutswidget.cpp \
@ -363,6 +378,7 @@ SOURCES += src/core/feeddownloader.cpp \
src/gui/feedmessageviewer.cpp \
src/gui/feedstoolbar.cpp \
src/gui/feedsview.cpp \
src/gui/guiutilities.cpp \
src/gui/labelwithstatus.cpp \
src/gui/lineeditwithstatus.cpp \
src/gui/messagebox.cpp \
@ -370,6 +386,15 @@ SOURCES += src/core/feeddownloader.cpp \
src/gui/messagestoolbar.cpp \
src/gui/messagesview.cpp \
src/gui/plaintoolbutton.cpp \
src/gui/settings/settingsbrowsermail.cpp \
src/gui/settings/settingsdatabase.cpp \
src/gui/settings/settingsdownloads.cpp \
src/gui/settings/settingsfeedsmessages.cpp \
src/gui/settings/settingsgeneral.cpp \
src/gui/settings/settingsgui.cpp \
src/gui/settings/settingslocalization.cpp \
src/gui/settings/settingspanel.cpp \
src/gui/settings/settingsshortcuts.cpp \
src/gui/squeezelabel.cpp \
src/gui/statusbar.cpp \
src/gui/styleditemdelegatewithoutfocus.cpp \
@ -379,6 +404,7 @@ SOURCES += src/core/feeddownloader.cpp \
src/gui/tabwidget.cpp \
src/gui/timespinbox.cpp \
src/gui/toolbareditor.cpp \
src/gui/treeviewcolumnsmenu.cpp \
src/gui/widgetwithstatus.cpp \
src/main.cpp \
src/miscellaneous/application.cpp \
@ -387,6 +413,8 @@ SOURCES += src/core/feeddownloader.cpp \
src/miscellaneous/databasefactory.cpp \
src/miscellaneous/databasequeries.cpp \
src/miscellaneous/debugging.cpp \
src/miscellaneous/externaltool.cpp \
src/miscellaneous/feedreader.cpp \
src/miscellaneous/iconfactory.cpp \
src/miscellaneous/iofactory.cpp \
src/miscellaneous/localization.cpp \
@ -400,6 +428,7 @@ SOURCES += src/core/feeddownloader.cpp \
src/network-web/downloader.cpp \
src/network-web/downloadmanager.cpp \
src/network-web/networkfactory.cpp \
src/network-web/oauth2service.cpp \
src/network-web/silentnetworkaccessmanager.cpp \
src/network-web/webfactory.cpp \
src/qtsingleapplication/qtlocalpeer.cpp \
@ -407,6 +436,7 @@ SOURCES += src/core/feeddownloader.cpp \
src/qtsingleapplication/qtsingleapplication.cpp \
src/qtsingleapplication/qtsinglecoreapplication.cpp \
src/services/abstract/accountcheckmodel.cpp \
src/services/abstract/cacheforserviceroot.cpp \
src/services/abstract/category.cpp \
src/services/abstract/feed.cpp \
src/services/abstract/gui/formfeeddetails.cpp \
@ -414,55 +444,46 @@ SOURCES += src/core/feeddownloader.cpp \
src/services/abstract/rootitem.cpp \
src/services/abstract/serviceentrypoint.cpp \
src/services/abstract/serviceroot.cpp \
src/services/gmail/gmailentrypoint.cpp \
src/services/gmail/gmailfeed.cpp \
src/services/gmail/gmailserviceroot.cpp \
src/services/gmail/gui/formeditgmailaccount.cpp \
src/services/gmail/network/gmailnetworkfactory.cpp \
src/services/inoreader/gui/formeditinoreaderaccount.cpp \
src/services/inoreader/inoreaderentrypoint.cpp \
src/services/inoreader/inoreaderfeed.cpp \
src/services/inoreader/inoreaderserviceroot.cpp \
src/services/inoreader/network/inoreadernetworkfactory.cpp \
src/services/owncloud/gui/formeditowncloudaccount.cpp \
src/services/owncloud/gui/formowncloudfeeddetails.cpp \
src/services/owncloud/network/owncloudnetworkfactory.cpp \
src/services/owncloud/owncloudfeed.cpp \
src/services/owncloud/owncloudserviceentrypoint.cpp \
src/services/owncloud/owncloudserviceroot.cpp \
src/services/standard/atomparser.cpp \
src/services/standard/feedparser.cpp \
src/services/standard/gui/formstandardcategorydetails.cpp \
src/services/standard/gui/formstandardfeeddetails.cpp \
src/services/standard/gui/formstandardimportexport.cpp \
src/services/standard/rdfparser.cpp \
src/services/standard/rssparser.cpp \
src/services/standard/standardcategory.cpp \
src/services/standard/standardfeed.cpp \
src/services/standard/standardfeedsimportexportmodel.cpp \
src/services/standard/standardserviceentrypoint.cpp \
src/services/standard/standardserviceroot.cpp \
src/services/tt-rss/gui/formeditttrssaccount.cpp \
src/services/tt-rss/gui/formttrssfeeddetails.cpp \
src/services/tt-rss/network/ttrssnetworkfactory.cpp \
src/services/tt-rss/ttrssfeed.cpp \
src/services/tt-rss/ttrssserviceentrypoint.cpp \
src/services/tt-rss/ttrssserviceroot.cpp \
src/gui/settings/settingspanel.cpp \
src/gui/settings/settingsgeneral.cpp \
src/gui/settings/settingsdatabase.cpp \
src/gui/settings/settingsshortcuts.cpp \
src/gui/settings/settingsgui.cpp \
src/gui/settings/settingslocalization.cpp \
src/gui/settings/settingsbrowsermail.cpp \
src/gui/settings/settingsfeedsmessages.cpp \
src/gui/settings/settingsdownloads.cpp \
src/miscellaneous/feedreader.cpp \
src/services/standard/atomparser.cpp \
src/services/standard/feedparser.cpp \
src/services/standard/rdfparser.cpp \
src/services/standard/rssparser.cpp \
src/services/abstract/cacheforserviceroot.cpp \
src/services/tt-rss/gui/formeditttrssaccount.cpp \
src/gui/guiutilities.cpp \
src/core/messagesmodelcache.cpp \
src/core/messagesmodelsqllayer.cpp \
src/gui/treeviewcolumnsmenu.cpp \
src/miscellaneous/externaltool.cpp
src/services/tt-rss/ttrssserviceroot.cpp
mac {
OBJECTIVE_SOURCES += src/miscellaneous/disablewindowtabbing.mm
}
FORMS += src/gui/toolbareditor.ui \
src/network-web/downloaditem.ui \
src/network-web/downloadmanager.ui \
src/gui/dialogs/formabout.ui \
FORMS += src/gui/dialogs/formabout.ui \
src/gui/dialogs/formaddaccount.ui \
src/gui/dialogs/formbackupdatabasesettings.ui \
src/gui/dialogs/formdatabasecleanup.ui \
@ -470,18 +491,23 @@ FORMS += src/gui/toolbareditor.ui \
src/gui/dialogs/formrestoredatabasesettings.ui \
src/gui/dialogs/formsettings.ui \
src/gui/dialogs/formupdate.ui \
src/gui/settings/settingsbrowsermail.ui \
src/gui/settings/settingsdatabase.ui \
src/gui/settings/settingsdownloads.ui \
src/gui/settings/settingsfeedsmessages.ui \
src/gui/settings/settingsgeneral.ui \
src/gui/settings/settingsgui.ui \
src/gui/settings/settingslocalization.ui \
src/gui/settings/settingsshortcuts.ui \
src/gui/toolbareditor.ui \
src/network-web/downloaditem.ui \
src/network-web/downloadmanager.ui \
src/services/abstract/gui/formfeeddetails.ui \
src/services/gmail/gui/formeditgmailaccount.ui \
src/services/inoreader/gui/formeditinoreaderaccount.ui \
src/services/owncloud/gui/formeditowncloudaccount.ui \
src/services/standard/gui/formstandardcategorydetails.ui \
src/services/standard/gui/formstandardimportexport.ui \
src/gui/settings/settingsgeneral.ui \
src/gui/settings/settingsdatabase.ui \
src/gui/settings/settingsshortcuts.ui \
src/gui/settings/settingsgui.ui \
src/gui/settings/settingslocalization.ui \
src/gui/settings/settingsbrowsermail.ui \
src/gui/settings/settingsfeedsmessages.ui \
src/gui/settings/settingsdownloads.ui \
src/services/tt-rss/gui/formeditttrssaccount.ui
equals(USE_WEBENGINE, true) {
@ -492,20 +518,7 @@ equals(USE_WEBENGINE, true) {
src/network-web/googlesuggest.h \
src/network-web/webpage.h \
src/network-web/rssguardschemehandler.h \
src/services/inoreader/definitions.h \
src/services/inoreader/inoreaderentrypoint.h \
src/services/inoreader/network/inoreadernetworkfactory.h \
src/services/inoreader/inoreaderserviceroot.h \
src/services/inoreader/gui/formeditinoreaderaccount.h \
src/services/inoreader/inoreaderfeed.h \
src/network-web/oauth2service.h \
src/gui/dialogs/oauthlogin.h \
src/services/gmail/definitions.h \
src/services/gmail/gmailentrypoint.h \
src/services/gmail/gmailserviceroot.h \
src/services/gmail/gmailfeed.h \
src/services/gmail/network/gmailnetworkfactory.h \
src/services/gmail/gui/formeditgmailaccount.h
src/gui/dialogs/oauthlogin.h
SOURCES += src/gui/locationlineedit.cpp \
src/gui/webviewer.cpp \
@ -514,18 +527,7 @@ equals(USE_WEBENGINE, true) {
src/network-web/googlesuggest.cpp \
src/network-web/webpage.cpp \
src/network-web/rssguardschemehandler.cpp \
src/services/inoreader/inoreaderentrypoint.cpp \
src/services/inoreader/network/inoreadernetworkfactory.cpp \
src/services/inoreader/inoreaderserviceroot.cpp \
src/services/inoreader/gui/formeditinoreaderaccount.cpp \
src/services/inoreader/inoreaderfeed.cpp \
src/network-web/oauth2service.cpp \
src/gui/dialogs/oauthlogin.cpp \
src/services/gmail/gmailentrypoint.cpp \
src/services/gmail/gmailserviceroot.cpp \
src/services/gmail/gmailfeed.cpp \
src/services/gmail/network/gmailnetworkfactory.cpp \
src/services/gmail/gui/formeditgmailaccount.cpp
src/gui/dialogs/oauthlogin.cpp
# Add AdBlock sources.
HEADERS += src/network-web/adblock/adblockaddsubscriptiondialog.h \
@ -559,9 +561,7 @@ equals(USE_WEBENGINE, true) {
FORMS += src/network-web/adblock/adblockaddsubscriptiondialog.ui \
src/network-web/adblock/adblockdialog.ui \
src/services/inoreader/gui/formeditinoreaderaccount.ui \
src/gui/dialogs/oauthlogin.ui \
src/services/gmail/gui/formeditgmailaccount.ui
src/gui/dialogs/oauthlogin.ui
}
else {
HEADERS += src/gui/messagepreviewer.h \

View file

@ -175,6 +175,7 @@ int main(int argc, char* argv[]) {
qApp->showPolls();
qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsView()->loadAllExpandStates();
/*
OAuth2Service* srv = new OAuth2Service(
"https://accounts.google.com/o/oauth2/auth",
"https://accounts.google.com/o/oauth2/token",
@ -182,7 +183,7 @@ int main(int argc, char* argv[]) {
"vppQtxrEeBkImiXcjGYl9NxZ",
"https://mail.google.com/");
srv->setRefreshToken("1/RKE3oohSoTHE54L0IPflvndK-DcI7l0of3lVdLa1Q9Q");
//srv->setRefreshToken("1/RKE3oohSoTHE54L0IPflvndK-DcI7l0of3lVdLa1Q9Q");
QObject::connect(srv, &OAuth2Service::authCodeObtained, [](QString auth_code) {
int a = 5;
});
@ -225,7 +226,7 @@ int main(int argc, char* argv[]) {
QObject::connect(srv, &OAuth2Service::tokensRetrieveError, [](QString err, QString desc) {
int a = 5;
});
srv->login();
srv->login();*/
// Enter global event loop.
return Application::exec();

View file

@ -21,7 +21,15 @@
#include "miscellaneous/application.h"
#include "miscellaneous/iconfactory.h"
#include "miscellaneous/textfactory.h"
#include "network-web/oauth2service.h"
#include "services/abstract/category.h"
#include "services/gmail/definitions.h"
#include "services/gmail/gmailserviceroot.h"
#include "services/gmail/network/gmailnetworkfactory.h"
#include "services/inoreader/definitions.h"
#include "services/inoreader/inoreaderfeed.h"
#include "services/inoreader/inoreaderserviceroot.h"
#include "services/inoreader/network/inoreadernetworkfactory.h"
#include "services/owncloud/definitions.h"
#include "services/owncloud/network/owncloudnetworkfactory.h"
#include "services/owncloud/owncloudfeed.h"
@ -33,16 +41,6 @@
#include "services/tt-rss/ttrssfeed.h"
#include "services/tt-rss/ttrssserviceroot.h"
#if defined(USE_WEBENGINE)
#include "network-web/oauth2service.h"
#include "services/gmail/gmailserviceroot.h"
#include "services/gmail/network/gmailnetworkfactory.h"
#include "services/inoreader/definitions.h"
#include "services/inoreader/inoreaderfeed.h"
#include "services/inoreader/inoreaderserviceroot.h"
#include "services/inoreader/network/inoreadernetworkfactory.h"
#endif
#include <QSqlError>
#include <QUrl>
#include <QVariant>
@ -1493,7 +1491,6 @@ Assignment DatabaseQueries::getCategories(QSqlDatabase db, int account_id, bool*
return categories;
}
#if defined(USE_WEBENGINE)
QList<ServiceRoot*> DatabaseQueries::getGmailAccounts(QSqlDatabase db, bool* ok) {
QSqlQuery query(db);
@ -1530,6 +1527,15 @@ QList<ServiceRoot*> DatabaseQueries::getGmailAccounts(QSqlDatabase db, bool* ok)
return roots;
}
bool DatabaseQueries::deleteGmailAccount(QSqlDatabase db, int account_id) {
QSqlQuery q(db);
q.setForwardOnly(true);
q.prepare(QSL("DELETE FROM GmailAccounts WHERE id = :id;"));
q.bindValue(QSL(":id"), account_id);
return q.exec();
}
bool DatabaseQueries::deleteInoreaderAccount(QSqlDatabase db, int account_id) {
QSqlQuery q(db);
@ -1624,6 +1630,56 @@ QList<ServiceRoot*> DatabaseQueries::getInoreaderAccounts(QSqlDatabase db, bool*
return roots;
}
bool DatabaseQueries::overwriteGmailAccount(QSqlDatabase db, const QString& username, const QString& app_id,
const QString& app_key, const QString& redirect_url,
const QString& refresh_token, int batch_size, int account_id) {
QSqlQuery query(db);
query.prepare("UPDATE GmailAccounts "
"SET username = :username, app_id = :app_id, app_key = :app_key, "
"redirect_url = :redirect_url, refresh_token = :refresh_token , msg_limit = :msg_limit "
"WHERE id = :id;");
query.bindValue(QSL(":username"), username);
query.bindValue(QSL(":app_id"), app_id);
query.bindValue(QSL(":app_key"), app_key);
query.bindValue(QSL(":redirect_url"), redirect_url);
query.bindValue(QSL(":refresh_token"), refresh_token);
query.bindValue(QSL(":id"), account_id);
query.bindValue(QSL(":msg_limit"), batch_size <= 0 ? GMAIL_DEFAULT_BATCH_SIZE : batch_size);
if (query.exec()) {
return true;
}
else {
qWarning("Gmail: Updating account failed: '%s'.", qPrintable(query.lastError().text()));
return false;
}
}
bool DatabaseQueries::createGmailAccount(QSqlDatabase db, int id_to_assign, const QString& username,
const QString& app_id, const QString& app_key, const QString& redirect_url,
const QString& refresh_token, int batch_size) {
QSqlQuery q(db);
q.prepare("INSERT INTO GmailAccounts (id, username, app_id, app_key, redirect_url, refresh_token, msg_limit) "
"VALUES (:id, :username, :app_id, :app_key, :redirect_url, :refresh_token, :msg_limit);");
q.bindValue(QSL(":id"), id_to_assign);
q.bindValue(QSL(":username"), username);
q.bindValue(QSL(":app_id"), app_id);
q.bindValue(QSL(":app_key"), app_key);
q.bindValue(QSL(":redirect_url"), redirect_url);
q.bindValue(QSL(":refresh_token"), refresh_token);
q.bindValue(QSL(":msg_limit"), batch_size <= 0 ? GMAIL_DEFAULT_BATCH_SIZE : batch_size);
if (q.exec()) {
return true;
}
else {
qWarning("Gmail: Inserting of new account failed: '%s'.", qPrintable(q.lastError().text()));
return false;
}
}
bool DatabaseQueries::overwriteInoreaderAccount(QSqlDatabase db, const QString& username, const QString& app_id,
const QString& app_key, const QString& redirect_url,
const QString& refresh_token, int batch_size, int account_id) {
@ -1674,8 +1730,6 @@ bool DatabaseQueries::createInoreaderAccount(QSqlDatabase db, int id_to_assign,
}
}
#endif
Assignment DatabaseQueries::getTtRssFeeds(QSqlDatabase db, int account_id, bool* ok) {
Assignment feeds;

View file

@ -78,10 +78,15 @@ class DatabaseQueries {
int auto_update_interval);
static Assignment getCategories(QSqlDatabase db, int account_id, bool* ok = nullptr);
#if defined(USE_WEBENGINE)
// Gmail account.
static bool deleteGmailAccount(QSqlDatabase db, int account_id);
static QList<ServiceRoot*> getGmailAccounts(QSqlDatabase db, bool* ok = nullptr);
static bool overwriteGmailAccount(QSqlDatabase db, const QString& username, const QString& app_id,
const QString& app_key, const QString& redirect_url, const QString& refresh_token,
int batch_size, int account_id);
static bool createGmailAccount(QSqlDatabase db, int id_to_assign, const QString& username,
const QString& app_id, const QString& app_key, const QString& redirect_url,
const QString& refresh_token, int batch_size);
// Inoreader account.
static bool deleteInoreaderAccount(QSqlDatabase db, int account_id);
@ -94,7 +99,6 @@ class DatabaseQueries {
static bool createInoreaderAccount(QSqlDatabase db, int id_to_assign, const QString& username,
const QString& app_id, const QString& app_key, const QString& redirect_url,
const QString& refresh_token, int batch_size);
#endif
// ownCloud account.
static QList<ServiceRoot*> getOwnCloudAccounts(QSqlDatabase db, bool* ok = nullptr);

View file

@ -18,13 +18,6 @@
#include "miscellaneous/feedreader.h"
#include "services/abstract/serviceroot.h"
#if defined(USE_WEBENGINE)
#include "services/gmail/gmailentrypoint.h"
#include "services/inoreader/inoreaderentrypoint.h"
#endif
#include "core/feeddownloader.h"
#include "core/feedsmodel.h"
#include "core/feedsproxymodel.h"
@ -34,6 +27,9 @@
#include "miscellaneous/databasecleaner.h"
#include "miscellaneous/mutex.h"
#include "services/abstract/cacheforserviceroot.h"
#include "services/abstract/serviceroot.h"
#include "services/gmail/gmailentrypoint.h"
#include "services/inoreader/inoreaderentrypoint.h"
#include "services/owncloud/owncloudserviceentrypoint.h"
#include "services/standard/standardserviceentrypoint.h"
#include "services/tt-rss/ttrssserviceentrypoint.h"
@ -70,10 +66,8 @@ FeedReader::~FeedReader() {
QList<ServiceEntryPoint*> FeedReader::feedServices() {
if (m_feedServices.isEmpty()) {
// NOTE: All installed services create their entry points here.
#if defined(USE_WEBENGINE)
m_feedServices.append(new GmailEntryPoint());
m_feedServices.append(new InoreaderEntryPoint());
#endif
m_feedServices.append(new OwnCloudServiceEntryPoint());
m_feedServices.append(new StandardServiceEntryPoint());
m_feedServices.append(new TtRssServiceEntryPoint());

View file

@ -41,10 +41,13 @@
#include "network-web/oauth2service.h"
#include "definitions/definitions.h"
#include "gui/dialogs/oauthlogin.h"
#include "miscellaneous/application.h"
#include "services/inoreader/definitions.h"
#if defined(USE_WEBENGINE)
#include "gui/dialogs/oauthlogin.h"
#endif
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
@ -70,7 +73,7 @@ OAuth2Service::OAuth2Service(QString authUrl, QString tokenUrl, QString clientId
QString OAuth2Service::bearer() {
if (!isFullyLoggedIn()) {
qApp->showGuiMessage(tr("Inoreader: you have to login first"),
qApp->showGuiMessage(tr("You have to login first"),
tr("Click here to login."),
QSystemTrayIcon::Critical,
nullptr, false,
@ -165,13 +168,13 @@ void OAuth2Service::refreshAccessToken(QString refresh_token) {
}
void OAuth2Service::tokenRequestFinished(QNetworkReply* network_reply) {
QJsonDocument json_document = QJsonDocument::fromJson(network_reply->readAll());
QByteArray repl = network_reply->readAll();
QJsonDocument json_document = QJsonDocument::fromJson(repl);
QJsonObject root_obj = json_document.object();
auto cod = network_reply->error();
qDebug() << "Token response:" << json_document.toJson();
IOFactory::writeTextFile("c.json", json_document.toJson());
if (root_obj.keys().contains("error")) {
QString error = root_obj.value("error").toString();
QString error_description = root_obj.value("error_description").toString();
@ -293,6 +296,8 @@ void OAuth2Service::retrieveAuthCode() {
"prompt=consent&access_type=offline").arg(m_clientId,
m_scope,
m_redirectUrl);
#if defined(USE_WEBENGINE)
OAuthLogin login_page(qApp->mainFormWidget());
connect(&login_page, &OAuthLogin::authGranted, this, &OAuth2Service::authCodeObtained);
@ -306,4 +311,7 @@ void OAuth2Service::retrieveAuthCode() {
QSystemTrayIcon::MessageIcon::Information);
login_page.login(auth_url, m_redirectUrl);
#endif
// TODO: For non-webengine version, user http-server and login via external browser.
}

View file

@ -23,6 +23,8 @@
#define GMAIL_OAUTH_TOKEN_URL "https://accounts.google.com/o/oauth2/token"
#define GMAIL_OAUTH_SCOPE "https://mail.google.com/"
#define GMAIL_API_LABELS_LIST "https://www.googleapis.com/gmail/v1/users/me/labels"
#define GMAIL_DEFAULT_BATCH_SIZE 100
#define GMAIL_MAX_BATCH_SIZE 999
#define GMAIL_MIN_BATCH_SIZE 20

View file

@ -26,10 +26,19 @@
#include "services/gmail/gmailserviceroot.h"
#include "services/gmail/gui/formeditgmailaccount.h"
#include <QMessageBox>
ServiceRoot* GmailEntryPoint::createNewRoot() const {
#if defined(USE_WEBENGINE)
FormEditGmailAccount form_acc(qApp->mainFormWidget());
return form_acc.execForCreate();
#else
QMessageBox::warning(qApp->mainFormWidget(),
QObject::tr("Not supported"),
QObject::tr("This plugin is not supported in NonWebEngine variant of this program."));
return nullptr;
#endif
}
QList<ServiceRoot*> GmailEntryPoint::initializeSubtree() const {
@ -43,7 +52,7 @@ bool GmailEntryPoint::isSingleInstanceService() const {
}
QString GmailEntryPoint::name() const {
return QSL("Gmail (not yet implemented)");
return QSL("Gmail");
}
QString GmailEntryPoint::code() const {

View file

@ -64,9 +64,7 @@ void GmailServiceRoot::saveAccountDataToDatabase() {
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
if (accountId() != NO_PARENT_CATEGORY) {
// TODO: dodělat
/*if (DatabaseQueries::overwriteInoreaderAccount(database, m_network->userName(),
if (DatabaseQueries::overwriteGmailAccount(database, m_network->userName(),
m_network->oauth()->clientId(),
m_network->oauth()->clientSecret(),
m_network->oauth()->redirectUrl(),
@ -75,16 +73,14 @@ void GmailServiceRoot::saveAccountDataToDatabase() {
accountId())) {
updateTitle();
itemChanged(QList<RootItem*>() << this);
}*/
}
}
else {
bool saved;
int id_to_assign = DatabaseQueries::createAccount(database, code(), &saved);
if (saved) {
// TODO: dodělat
/*if (DatabaseQueries::createInoreaderAccount(database, id_to_assign,
if (DatabaseQueries::createGmailAccount(database, id_to_assign,
m_network->userName(),
m_network->oauth()->clientId(),
m_network->oauth()->clientSecret(),
@ -94,7 +90,7 @@ void GmailServiceRoot::saveAccountDataToDatabase() {
setId(id_to_assign);
setAccountId(id_to_assign);
updateTitle();
}*/
}
}
}
}
@ -158,10 +154,7 @@ QString GmailServiceRoot::additionalTooltip() const {
}
RootItem* GmailServiceRoot::obtainNewTreeForSyncIn() const {
// TODO: dodělat
return nullptr;
//return m_network->feedsCategories(true);
return m_network->feedsCategories();
}
void GmailServiceRoot::addNewFeed(const QString& url) {
@ -215,7 +208,7 @@ bool GmailServiceRoot::canBeDeleted() const {
bool GmailServiceRoot::deleteViaGui() {
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
if (DatabaseQueries::deleteInoreaderAccount(database, accountId())) {
if (DatabaseQueries::deleteGmailAccount(database, accountId())) {
return ServiceRoot::deleteViaGui();
}
else {

View file

@ -79,8 +79,7 @@ void FormEditGmailAccount::testSetup() {
if (m_oauth->login()) {
m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok,
tr("You are already logged in."),
tr("Access granted. \
"));
tr("Access granted."));
}
}

View file

@ -76,7 +76,7 @@ void GmailNetworkFactory::initializeOauth() {
DatabaseQueries::storeNewInoreaderTokens(database, refresh_token, m_service->accountId());
qApp->showGuiMessage(tr("Logged in successfully"),
tr("Your login to Inoreader was authorized."),
tr("Your login to Gmail was authorized."),
QSystemTrayIcon::MessageIcon::Information);
}
});
@ -86,7 +86,7 @@ void GmailNetworkFactory::setUsername(const QString& username) {
m_username = username;
}
RootItem* GmailNetworkFactory::feedsCategories(bool obtain_icons) {
RootItem* GmailNetworkFactory::feedsCategories() {
Downloader downloader;
QEventLoop loop;
QString bearer = m_oauth2->bearer().toLocal8Bit();
@ -95,13 +95,13 @@ RootItem* GmailNetworkFactory::feedsCategories(bool obtain_icons) {
return nullptr;
}
downloader.appendRawHeader(QString("Authorization").toLocal8Bit(), bearer.toLocal8Bit());
downloader.appendRawHeader(QString(HTTP_HEADERS_AUTHORIZATION).toLocal8Bit(), bearer.toLocal8Bit());
// We need to quit event loop when the download finishes.
connect(&downloader, &Downloader::completed, &loop, &QEventLoop::quit);
// TODO: dodělat
//downloader.manipulateData(INOREADER_API_LIST_LABELS, QNetworkAccessManager::Operation::GetOperation);
downloader.manipulateData(GMAIL_API_LABELS_LIST, QNetworkAccessManager::Operation::GetOperation);
loop.exec();
if (downloader.lastOutputError() != QNetworkReply::NetworkError::NoError) {
@ -110,17 +110,7 @@ RootItem* GmailNetworkFactory::feedsCategories(bool obtain_icons) {
QString category_data = downloader.lastOutputData();
// TODO: dodělat
//downloader.manipulateData(INOREADER_API_LIST_FEEDS, QNetworkAccessManager::Operation::GetOperation);
loop.exec();
if (downloader.lastOutputError() != QNetworkReply::NetworkError::NoError) {
return nullptr;
}
QString feed_data = downloader.lastOutputData();
return decodeFeedCategoriesData(category_data, feed_data, obtain_icons);
return decodeFeedCategoriesData(category_data);
}
QList<Message> GmailNetworkFactory::messages(const QString& stream_id, Feed::Status& error) {
@ -382,9 +372,9 @@ QList<Message> GmailNetworkFactory::decodeMessages(const QString& messages_json_
return messages;
}
RootItem* GmailNetworkFactory::decodeFeedCategoriesData(const QString& categories, const QString& feeds, bool obtain_icons) {
RootItem* GmailNetworkFactory::decodeFeedCategoriesData(const QString& categories) {
RootItem* parent = new RootItem();
QJsonArray json = QJsonDocument::fromJson(categories.toUtf8()).object()["tags"].toArray();
QJsonArray json = QJsonDocument::fromJson(categories.toUtf8()).object()["labels"].toArray();
QMap<QString, RootItem*> cats;
cats.insert(QString(), parent);
@ -392,7 +382,22 @@ RootItem* GmailNetworkFactory::decodeFeedCategoriesData(const QString& categorie
foreach (const QJsonValue& obj, json) {
auto label = obj.toObject();
QString label_id = label["id"].toString();
QString label_name = label["name"].toString();
QString label_type = label["type"].toString();
if (label_name.contains(QL1C('/'))) {
// We have nested labels.
}
else {
GmailFeed* feed = new GmailFeed();
feed->setTitle(label_name);
feed->setCustomId(label_id);
parent->appendChild(feed);
}
/*
if (label_id.contains(QSL("/label/"))) {
// We have label (not "state").
Category* category = new Category();
@ -405,9 +410,10 @@ RootItem* GmailNetworkFactory::decodeFeedCategoriesData(const QString& categorie
// All categories in ownCloud are top-level.
parent->appendChild(category);
}
}*/
}
/*
json = QJsonDocument::fromJson(feeds.toUtf8()).object()["subscriptions"].toArray();
foreach (const QJsonValue& obj, json) {
@ -435,28 +441,10 @@ RootItem* GmailNetworkFactory::decodeFeedCategoriesData(const QString& categorie
feed->setTitle(title);
feed->setCustomId(id);
if (obtain_icons) {
QString icon_url = subscription["iconUrl"].toString();
if (!icon_url.isEmpty()) {
QByteArray icon_data;
if (NetworkFactory::performNetworkOperation(icon_url, DOWNLOAD_TIMEOUT,
QByteArray(), icon_data,
QNetworkAccessManager::GetOperation).first == QNetworkReply::NoError) {
// Icon downloaded, set it up.
QPixmap icon_pixmap;
icon_pixmap.loadFromData(icon_data);
feed->setIcon(QIcon(icon_pixmap));
}
}
}
if (cats.contains(parent_label)) {
cats[parent_label]->appendChild(feed);
}
}
}*/
return parent;
}

View file

@ -52,7 +52,7 @@ class GmailNetworkFactory : public QObject {
// Returns tree of feeds/categories.
// Top-level root of the tree is not needed here.
// Returned items do not have primary IDs assigned.
RootItem* feedsCategories(bool obtain_icons);
RootItem* feedsCategories();
QList<Message> messages(const QString& stream_id, Feed::Status& error);
void markMessagesRead(RootItem::ReadStatus status, const QStringList& custom_ids, bool async = true);
@ -64,7 +64,7 @@ class GmailNetworkFactory : public QObject {
private:
QList<Message> decodeMessages(const QString& messages_json_data, const QString& stream_id);
RootItem* decodeFeedCategoriesData(const QString& categories, const QString& feeds, bool obtain_icons);
RootItem* decodeFeedCategoriesData(const QString& categories);
void initializeOauth();

View file

@ -27,10 +27,19 @@
#include "services/inoreader/inoreaderserviceroot.h"
#include "services/inoreader/network/inoreadernetworkfactory.h"
#include <QMessageBox>
ServiceRoot* InoreaderEntryPoint::createNewRoot() const {
#if defined(USE_WEBENGINE)
FormEditInoreaderAccount form_acc(qApp->mainFormWidget());
return form_acc.execForCreate();
#else
QMessageBox::warning(qApp->mainFormWidget(),
QObject::tr("Not supported"),
QObject::tr("This plugin is not supported in NonWebEngine variant of this program."));
return nullptr;
#endif
}
QList<ServiceRoot*> InoreaderEntryPoint::initializeSubtree() const {