diff --git a/resources/misc/db_init.sql b/resources/misc/db_init.sql index 55486f933..3b2135ad7 100644 --- a/resources/misc/db_init.sql +++ b/resources/misc/db_init.sql @@ -1,8 +1,8 @@ DROP TABLE IF EXISTS Information; -- ! CREATE TABLE IF NOT EXISTS Information ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL + key TEXT PRIMARY KEY, + value TEXT NOT NULL ); -- ! INSERT INTO Information VALUES ('schema_version', '0.0.1'); @@ -10,13 +10,13 @@ INSERT INTO Information VALUES ('schema_version', '0.0.1'); DROP TABLE IF EXISTS Categories; -- ! CREATE TABLE IF NOT EXISTS Categories ( - id INTEGER PRIMARY KEY, - parent_id INTEGER NOT NULL, - title TEXT NOT NULL UNIQUE CHECK (title != ''), - description TEXT, - date_created INTEGER NOT NULL CHECK (date_created != 0), - icon BLOB, - type INTEGER NOT NULL, + id INTEGER PRIMARY KEY, + parent_id INTEGER NOT NULL, + title TEXT NOT NULL UNIQUE CHECK (title != ''), + description TEXT, + date_created INTEGER NOT NULL CHECK (date_created != 0), + icon BLOB, + type INTEGER NOT NULL, FOREIGN KEY (parent_id) REFERENCES Categories (id) ); @@ -24,23 +24,26 @@ CREATE TABLE IF NOT EXISTS Categories ( DROP TABLE IF EXISTS Feeds; -- ! CREATE TABLE IF NOT EXISTS Feeds ( - id INTEGER PRIMARY KEY, - title TEXT NOT NULL CHECK (title != ''), - description TEXT, - date_created INTEGER NOT NULL CHECK (date_created != 0), - icon BLOB, - category INTEGER NOT NULL CHECK (category >= -1), - encoding TEXT NOT NULL CHECK (encoding != ''), - url TEXT NOT NULL UNIQUE CHECK (url != ''), - type INTEGER NOT NULL CHECK (type >= 0) + id INTEGER PRIMARY KEY, + title TEXT NOT NULL CHECK (title != ''), + description TEXT, + date_created INTEGER NOT NULL CHECK (date_created != 0), + icon BLOB, + category INTEGER NOT NULL CHECK (category >= -1), + encoding TEXT NOT NULL CHECK (encoding != ''), + url TEXT NOT NULL UNIQUE CHECK (url != ''), + protected INTEGER(1) NOT NULL CHECK (protected >= 0 AND protected <= 1), + username TEXT, + password TEXT, + type INTEGER NOT NULL CHECK (type >= 0) ); -- ! DROP TABLE IF EXISTS FeedsData; -- ! CREATE TABLE IF NOT EXISTS FeedsData ( - feed_id INTEGER NOT NULL, - key TEXT NOT NULL, - value TEXT, + feed_id INTEGER NOT NULL, + key TEXT NOT NULL, + value TEXT, PRIMARY KEY (feed_id, key), FOREIGN KEY (feed_id) REFERENCES Feeds (id) @@ -49,16 +52,16 @@ CREATE TABLE IF NOT EXISTS FeedsData ( DROP TABLE IF EXISTS Messages; -- ! CREATE TABLE IF NOT EXISTS Messages ( - id INTEGER PRIMARY KEY, - read INTEGER(1) NOT NULL CHECK (read >= 0 AND read <= 1) DEFAULT (0), - deleted INTEGER(1) NOT NULL CHECK (deleted >= 0 AND deleted <= 1) DEFAULT (0), - important INTEGER(1) NOT NULL CHECK (important >= 0 AND important <= 1) DEFAULT (0), - feed INTEGER NOT NULL, - title TEXT NOT NULL CHECK (title != ''), - url TEXT, - author TEXT, - date_created INTEGER NOT NULL CHECK (date_created != 0), - contents TEXT, + id INTEGER PRIMARY KEY, + read INTEGER(1) NOT NULL CHECK (read >= 0 AND read <= 1) DEFAULT (0), + deleted INTEGER(1) NOT NULL CHECK (deleted >= 0 AND deleted <= 1) DEFAULT (0), + important INTEGER(1) NOT NULL CHECK (important >= 0 AND important <= 1) DEFAULT (0), + feed INTEGER NOT NULL, + title TEXT NOT NULL CHECK (title != ''), + url TEXT, + author TEXT, + date_created INTEGER NOT NULL CHECK (date_created != 0), + contents TEXT, FOREIGN KEY (feed) REFERENCES Feeds (id) ); @@ -67,14 +70,14 @@ INSERT INTO Categories (id, parent_id, title, description, date_created, type, i -- ! INSERT INTO Categories (id, parent_id, title, description, date_created, type, icon) VALUES (2, -1, 'RSS Guard', 'News and updates on RSS Guard.', 1388678961000, 0, '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'); -- ! -INSERT INTO Feeds (title, description, date_created, category, encoding, url, type) VALUES ('Linux Today', 'Linux Today - Linux News on Internet Time.', 1388678961000, 1, 'UTF-8', 'http://feeds.feedburner.com/linuxtoday/linux?format=xml', 1); +INSERT INTO Feeds (title, description, date_created, category, encoding, url, protected, type) VALUES ('Linux Today', 'Linux Today - Linux News on Internet Time.', 1388678961000, 1, 'UTF-8', 'http://feeds.feedburner.com/linuxtoday/linux?format=xml', 0, 1); -- ! -INSERT INTO Feeds (title, description, date_created, category, encoding, url, type) VALUES ('LinuxInsider', 'LinuxInsider: Linux News & Information from Around the World.', 1388678961000, 1, 'UTF-8', 'http://www.linuxinsider.com/perl/syndication/rssfull.pl', 2); +INSERT INTO Feeds (title, description, date_created, category, encoding, url, protected, type) VALUES ('LinuxInsider', 'LinuxInsider: Linux News & Information from Around the World.', 1388678961000, 1, 'UTF-8', 'http://www.linuxinsider.com/perl/syndication/rssfull.pl', 0, 2); -- ! -INSERT INTO Feeds (title, description, date_created, category, encoding, url, type) VALUES ('LXer: Linux News', 'The world is talking about GNU/Linux and Free/Open Source Software.', 1388678961000, 1, 'UTF-8', 'http://lxer.com/module/newswire/headlines.rss', 2); +INSERT INTO Feeds (title, description, date_created, category, encoding, url, protected, type) VALUES ('LXer: Linux News', 'The world is talking about GNU/Linux and Free/Open Source Software.', 1388678961000, 1, 'UTF-8', 'http://lxer.com/module/newswire/headlines.rss', 0, 2); -- ! -INSERT INTO Feeds (title, description, date_created, category, encoding, url, type) VALUES ('Recent Commits', 'Recent commits for RSS Guard project.', 1388678961000, 2, 'UTF-8', 'https://github.com/martinrotter/rssguard/commits/master.atom', 3); +INSERT INTO Feeds (title, description, date_created, category, encoding, url, protected, type) VALUES ('Recent Commits', 'Recent commits for RSS Guard project.', 1388678961000, 2, 'UTF-8', 'https://github.com/martinrotter/rssguard/commits/master.atom', 0, 3); -- ! -INSERT INTO Feeds (title, description, date_created, category, encoding, url, type) VALUES ('Releases', 'Releases for RSS Guard.', 1388678961000, 2, 'UTF-8', 'https://github.com/martinrotter/rssguard/releases.atom', 3); +INSERT INTO Feeds (title, description, date_created, category, encoding, url, protected, type) VALUES ('Releases', 'Releases for RSS Guard.', 1388678961000, 2, 'UTF-8', 'https://github.com/martinrotter/rssguard/releases.atom', 0, 3); -- ! -INSERT INTO Feeds (title, description, date_created, category, encoding, url, type) VALUES ('Author''s Activity', 'RSS Guard author public activity overview.', 1388678961000, 2, 'UTF-8', 'https://github.com/martinrotter.atom', 3); \ No newline at end of file +INSERT INTO Feeds (title, description, date_created, category, encoding, url, protected, type) VALUES ('Author''s Activity', 'RSS Guard author public activity overview.', 1388678961000, 2, 'UTF-8', 'https://github.com/martinrotter.atom', 0, 3); \ No newline at end of file diff --git a/resources/misc/db_init_memory.sql b/resources/misc/db_init_memory.sql index ae69d87cf..9e38fb071 100644 --- a/resources/misc/db_init_memory.sql +++ b/resources/misc/db_init_memory.sql @@ -1,20 +1,22 @@ DROP TABLE IF EXISTS Information; -- ! CREATE TABLE IF NOT EXISTS Information ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL + key TEXT PRIMARY KEY, + value TEXT NOT NULL ); -- ! +INSERT INTO Information VALUES ('schema_version', '0.0.1'); +-- ! DROP TABLE IF EXISTS Categories; -- ! CREATE TABLE IF NOT EXISTS Categories ( - id INTEGER PRIMARY KEY, - parent_id INTEGER NOT NULL, - title TEXT NOT NULL UNIQUE CHECK (title != ''), - description TEXT, - date_created INTEGER NOT NULL CHECK (date_created != 0), - icon BLOB, - type INTEGER NOT NULL, + id INTEGER PRIMARY KEY, + parent_id INTEGER NOT NULL, + title TEXT NOT NULL UNIQUE CHECK (title != ''), + description TEXT, + date_created INTEGER NOT NULL CHECK (date_created != 0), + icon BLOB, + type INTEGER NOT NULL, FOREIGN KEY (parent_id) REFERENCES Categories (id) ); @@ -22,23 +24,26 @@ CREATE TABLE IF NOT EXISTS Categories ( DROP TABLE IF EXISTS Feeds; -- ! CREATE TABLE IF NOT EXISTS Feeds ( - id INTEGER PRIMARY KEY, - title TEXT NOT NULL CHECK (title != ''), - description TEXT, - date_created INTEGER NOT NULL CHECK (date_created != 0), - icon BLOB, - category INTEGER NOT NULL CHECK (category >= -1), - encoding TEXT NOT NULL CHECK (encoding != ''), - url TEXT NOT NULL UNIQUE CHECK (url != ''), - type INTEGER NOT NULL CHECK (type >= 0) + id INTEGER PRIMARY KEY, + title TEXT NOT NULL CHECK (title != ''), + description TEXT, + date_created INTEGER NOT NULL CHECK (date_created != 0), + icon BLOB, + category INTEGER NOT NULL CHECK (category >= -1), + encoding TEXT NOT NULL CHECK (encoding != ''), + url TEXT NOT NULL UNIQUE CHECK (url != ''), + protected INTEGER(1) NOT NULL CHECK (protected >= 0 AND protected <= 1), + username TEXT, + password TEXT, + type INTEGER NOT NULL CHECK (type >= 0) ); -- ! DROP TABLE IF EXISTS FeedsData; -- ! CREATE TABLE IF NOT EXISTS FeedsData ( - feed_id INTEGER NOT NULL, - key TEXT NOT NULL, - value TEXT, + feed_id INTEGER NOT NULL, + key TEXT NOT NULL, + value TEXT, PRIMARY KEY (feed_id, key), FOREIGN KEY (feed_id) REFERENCES Feeds (id) @@ -47,16 +52,16 @@ CREATE TABLE IF NOT EXISTS FeedsData ( DROP TABLE IF EXISTS Messages; -- ! CREATE TABLE IF NOT EXISTS Messages ( - id INTEGER PRIMARY KEY, - read INTEGER(1) NOT NULL CHECK (read >= 0 AND read <= 1) DEFAULT (0), - deleted INTEGER(1) NOT NULL CHECK (deleted >= 0 AND deleted <= 1) DEFAULT (0), - important INTEGER(1) NOT NULL CHECK (important >= 0 AND important <= 1) DEFAULT (0), - feed INTEGER NOT NULL, - title TEXT NOT NULL CHECK (title != ''), - url TEXT, - author TEXT, - date_created INTEGER NOT NULL CHECK (date_created != 0), - contents TEXT, + id INTEGER PRIMARY KEY, + read INTEGER(1) NOT NULL CHECK (read >= 0 AND read <= 1) DEFAULT (0), + deleted INTEGER(1) NOT NULL CHECK (deleted >= 0 AND deleted <= 1) DEFAULT (0), + important INTEGER(1) NOT NULL CHECK (important >= 0 AND important <= 1) DEFAULT (0), + feed INTEGER NOT NULL, + title TEXT NOT NULL CHECK (title != ''), + url TEXT, + author TEXT, + date_created INTEGER NOT NULL CHECK (date_created != 0), + contents TEXT, FOREIGN KEY (feed) REFERENCES Feeds (id) ); \ No newline at end of file diff --git a/src/core/defs.h.in b/src/core/defs.h.in index 2314fd23d..0d5b796d4 100755 --- a/src/core/defs.h.in +++ b/src/core/defs.h.in @@ -96,9 +96,10 @@ #define FDS_DB_CATEGORY_INDEX 5 #define FDS_DB_ENCODING_INDEX 6 #define FDS_DB_URL_INDEX 7 -#define FDS_DB_TYPE_INDEX 8 -//#define FDS_DB_LANGUAGE_INDEX 8 -//#define FDS_DB_TYPE_INDEX 9 +#define FDS_DB_PROTECTED_INDEX 8 +#define FDS_DB_USERNAME_INDEX 9 +#define FDS_DB_PASSWORD_INDEX 10 +#define FDS_DB_TYPE_INDEX 11 // Indexes of columns for feed models. #define FDS_MODEL_TITLE_INDEX 0 diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index c599c2d91..dc3d25e86 100644 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -274,8 +274,8 @@ bool FeedsModel::addStandardFeed(FeedsModelStandardFeed *feed, query_add_feed.setForwardOnly(true); query_add_feed.prepare("INSERT INTO Feeds " - "(title, description, date_created, icon, category, encoding, url, type) " - "VALUES (:title, :description, :date_created, :icon, :category, :encoding, :url, :type);"); + "(title, description, date_created, icon, category, encoding, url, protected, username, password, type) " + "VALUES (:title, :description, :date_created, :icon, :category, :encoding, :url, :protected, :username, :password, :type);"); query_add_feed.bindValue(":title", feed->title()); query_add_feed.bindValue(":description", feed->description()); query_add_feed.bindValue(":date_created", feed->creationDate().toMSecsSinceEpoch()); @@ -283,6 +283,9 @@ bool FeedsModel::addStandardFeed(FeedsModelStandardFeed *feed, query_add_feed.bindValue(":category", parent->id()); query_add_feed.bindValue(":encoding", feed->encoding()); query_add_feed.bindValue(":url", feed->url()); + query_add_feed.bindValue(":protected", (int) feed->passwordProtected()); + query_add_feed.bindValue(":username", feed->username()); + query_add_feed.bindValue(":password", feed->password()); query_add_feed.bindValue(":type", (int) FeedsModelCategory::Standard); if (!query_add_feed.exec()) { @@ -321,7 +324,7 @@ bool FeedsModel::editStandardFeed(FeedsModelStandardFeed *original_feed, query_update_feed.setForwardOnly(true); query_update_feed.prepare("UPDATE Feeds " - "SET title = :title, description = :description, icon = :icon, category = :category, encoding = :encoding, url = :url, type = :type " + "SET title = :title, description = :description, icon = :icon, category = :category, encoding = :encoding, url = :url, protected = :protected, username = :username, password = :password, type = :type " "WHERE id = :id;"); query_update_feed.bindValue(":title", new_feed->title()); query_update_feed.bindValue(":description", new_feed->description()); @@ -329,10 +332,15 @@ bool FeedsModel::editStandardFeed(FeedsModelStandardFeed *original_feed, query_update_feed.bindValue(":category", new_parent->id()); query_update_feed.bindValue(":encoding", new_feed->encoding()); query_update_feed.bindValue(":url", new_feed->url()); + query_update_feed.bindValue(":protected", (int) new_feed->passwordProtected()); + query_update_feed.bindValue(":username", new_feed->username()); + query_update_feed.bindValue(":password", new_feed->password()); query_update_feed.bindValue(":type", new_feed->type()); query_update_feed.bindValue(":id", original_feed->id()); if (!query_update_feed.exec()) { + QString aaa = query_update_feed.lastError().databaseText(); + // Persistent storage update failed, no way to continue now. return false; } @@ -344,6 +352,9 @@ bool FeedsModel::editStandardFeed(FeedsModelStandardFeed *original_feed, original_feed->setEncoding(new_feed->encoding()); original_feed->setDescription(new_feed->description()); original_feed->setUrl(new_feed->url()); + original_feed->setPasswordProtected(new_feed->passwordProtected()); + original_feed->setUsername(new_feed->username()); + original_feed->setPassword(new_feed->password()); original_feed->setType(new_feed->type()); if (original_parent != new_parent) { diff --git a/src/core/feedsmodelfeed.cpp b/src/core/feedsmodelfeed.cpp index 887dd8c13..52a345c95 100755 --- a/src/core/feedsmodelfeed.cpp +++ b/src/core/feedsmodelfeed.cpp @@ -67,3 +67,6 @@ void FeedsModelFeed::updateCounts(bool including_total_count) { m_unreadCount = query_all.value(0).toInt(); } } + + + diff --git a/src/core/feedsmodelfeed.h b/src/core/feedsmodelfeed.h index aa97e804c..feca80a0c 100755 --- a/src/core/feedsmodelfeed.h +++ b/src/core/feedsmodelfeed.h @@ -48,6 +48,30 @@ class FeedsModelFeed : public FeedsModelRootItem { m_type = type; } + inline bool passwordProtected() const { + return m_passwordProtected; + } + + inline void setPasswordProtected(bool passwordProtected) { + m_passwordProtected = passwordProtected; + } + + inline QString username() const { + return m_username; + } + + inline void setUsername(const QString &username) { + m_username = username; + } + + inline QString password() const { + return m_password; + } + + inline void setPassword(const QString &password) { + m_password = password; + } + // Converts particular feed type to string. static QString typeToString(Type type); @@ -56,6 +80,10 @@ class FeedsModelFeed : public FeedsModelRootItem { void updateCounts(bool including_total_count = true); protected: + bool m_passwordProtected; + QString m_username; + QString m_password; + Type m_type; int m_totalCount; int m_unreadCount; diff --git a/src/core/feedsmodelstandardfeed.cpp b/src/core/feedsmodelstandardfeed.cpp index f4a7d43d7..cea553d83 100755 --- a/src/core/feedsmodelstandardfeed.cpp +++ b/src/core/feedsmodelstandardfeed.cpp @@ -32,6 +32,9 @@ FeedsModelStandardFeed *FeedsModelStandardFeed::loadFromRecord(const QSqlRecord feed->setIcon(IconFactory::fromByteArray(record.value(FDS_DB_ICON_INDEX).toByteArray())); feed->setEncoding(record.value(FDS_DB_ENCODING_INDEX).toString()); feed->setUrl(record.value(FDS_DB_URL_INDEX).toString()); + feed->setPasswordProtected(record.value(FDS_DB_PROTECTED_INDEX).toBool()); + feed->setUsername(record.value(FDS_DB_USERNAME_INDEX).toString()); + feed->setPassword(record.value(FDS_DB_PASSWORD_INDEX).toString()); feed->updateCounts(); return feed; diff --git a/src/core/networkfactory.cpp b/src/core/networkfactory.cpp index 95c2778e4..3fcb69bd1 100644 --- a/src/core/networkfactory.cpp +++ b/src/core/networkfactory.cpp @@ -1,6 +1,7 @@ #include "core/networkfactory.h" #include "core/silentnetworkaccessmanager.h" +#include "core/feedsmodelstandardfeed.h" #include #include @@ -25,8 +26,10 @@ QNetworkReply::NetworkError NetworkFactory::downloadFeedFile(const QString &url, QNetworkReply *reply; QObject originatingObject; - // Set feed as originating object. - originatingObject.setProperty("feed", QVariant::fromValue((void*) feed)); + // Set credential information as originating object. + originatingObject.setProperty("protected", feed->passwordProtected()); + originatingObject.setProperty("username", feed->username()); + originatingObject.setProperty("password", feed->password()); request.setOriginatingObject(&originatingObject); // Set url for this reques. diff --git a/src/core/silentnetworkaccessmanager.cpp b/src/core/silentnetworkaccessmanager.cpp index ff7b8d335..42c56073a 100644 --- a/src/core/silentnetworkaccessmanager.cpp +++ b/src/core/silentnetworkaccessmanager.cpp @@ -30,17 +30,19 @@ void SilentNetworkAccessManager::onSslErrors(QNetworkReply *reply, void SilentNetworkAccessManager::onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) { - FeedsModelStandardFeed *feed = static_cast(reply->request().originatingObject()->property("feed").value()); + QObject *originating_object = reply->request().originatingObject(); - // TODO: tady do autenticatoru dosadit udaje z feedu - // pokud je obsahuje - // a taky promyslet zda to delat takhle vubec, ale funguje - // to - /* - *authenticator->setUser("rotter.martinos"); - *authenticator->setPassword("gorottin0151"); - */ + if (originating_object->property("protected").toBool()) { + // This feed contains authentication information, it is good. + authenticator->setUser(originating_object->property("username").toString()); + authenticator->setPassword(originating_object->property("password").toString()); - qDebug("Authentication problems for '%s'.", - qPrintable(reply->url().toString())); + qDebug("Feed '%s' requested authentication and got it.", + qPrintable(reply->url().toString())); + } + else { + // Authentication is required but this feed does not contain it. + qDebug("Feed '%s' requested authentication but username/password is not available.", + qPrintable(reply->url().toString())); + } } diff --git a/src/gui/formstandardfeeddetails.cpp b/src/gui/formstandardfeeddetails.cpp index 95fe09974..44f4dfecc 100644 --- a/src/gui/formstandardfeeddetails.cpp +++ b/src/gui/formstandardfeeddetails.cpp @@ -181,6 +181,9 @@ void FormStandardFeedDetails::apply() { new_feed->setEncoding(m_ui->m_cmbEncoding->currentText()); new_feed->setType(type); new_feed->setUrl(m_ui->m_txtUrl->lineEdit()->text()); + new_feed->setPasswordProtected(m_ui->m_gbAuthentication->isChecked()); + new_feed->setUsername(m_ui->m_txtUsername->lineEdit()->text()); + new_feed->setPassword(m_ui->m_txtPassword->lineEdit()->text()); new_feed->setParent(parent); if (m_editableFeed == NULL) { @@ -235,6 +238,9 @@ void FormStandardFeedDetails::setEditableFeed(FeedsModelStandardFeed *editable_f m_ui->m_btnIcon->setIcon(editable_feed->icon()); m_ui->m_cmbType->setCurrentIndex(m_ui->m_cmbType->findData(QVariant::fromValue((int) editable_feed->type()))); m_ui->m_cmbEncoding->setCurrentIndex(m_ui->m_cmbEncoding->findData(editable_feed->encoding(), Qt::DisplayRole)); + m_ui->m_gbAuthentication->setChecked(editable_feed->passwordProtected()); + m_ui->m_txtUsername->lineEdit()->setText(editable_feed->username()); + m_ui->m_txtPassword->lineEdit()->setText(editable_feed->password()); m_ui->m_txtUrl->lineEdit()->setText(editable_feed->url()); } @@ -306,6 +312,18 @@ void FormStandardFeedDetails::initialize() { m_iconMenu->addAction(m_actionUseDefaultIcon); m_iconMenu->addAction(m_actionNoIcon); m_ui->m_btnIcon->setMenu(m_iconMenu); + + // Set tab order. + setTabOrder(m_ui->m_buttonBox, m_ui->m_cmbParentCategory); + setTabOrder(m_ui->m_cmbParentCategory, m_ui->m_cmbType); + setTabOrder(m_ui->m_cmbType, m_ui->m_txtTitle->lineEdit()); + setTabOrder(m_ui->m_txtTitle->lineEdit(), m_ui->m_txtDescription->lineEdit()); + setTabOrder(m_ui->m_txtDescription->lineEdit(), m_ui->m_txtUrl->lineEdit()); + setTabOrder(m_ui->m_txtUrl->lineEdit(), m_ui->m_cmbEncoding); + setTabOrder(m_ui->m_cmbEncoding, m_ui->m_btnIcon); + setTabOrder(m_ui->m_btnIcon, m_ui->m_gbAuthentication); + setTabOrder(m_ui->m_gbAuthentication, m_ui->m_txtUsername->lineEdit()); + setTabOrder(m_ui->m_txtUsername->lineEdit(), m_ui->m_txtPassword->lineEdit()); } void FormStandardFeedDetails::loadCategories(const QList categories,