Work on enclosures, only editing of skins remains.
This commit is contained in:
parent
21f970d456
commit
8c1414c3df
12 changed files with 109 additions and 81 deletions
|
|
@ -444,19 +444,6 @@ bool FeedsModelFeed::removeItself() {
|
||||||
return query_remove.exec();
|
return query_remove.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* postup zpracování zpráv:
|
|
||||||
* 1. Kontrola, zda existují již v DB zprávy se stejným NAZVEM, AUTOREM, URL ze stejneho kanalu.
|
|
||||||
* a. KONEC: Pokud neexistují, pak se aktuální nová zpráva přidá do DB.
|
|
||||||
* b. Pokud existují, jde se na krok 2.
|
|
||||||
* 2. Pokud má uživatel nastaveno mazání duplicitních zpráv, pak udělej a. Jinak jdi na krok 3.
|
|
||||||
* a. Vymaž všechny zprávy, které byly nalezeny ve kroku 1.
|
|
||||||
* b. Přidej tuto novou zprávu, nastav ji status přečtena na true.
|
|
||||||
* 3. Uživatel nemá nastaveno mazani dupl zpráv. Novou zprávu přidáme do DB tehdy když zpráva
|
|
||||||
* má datum získané z kanálu a zároveň identická zpráva s takovým datumem ještě v DB není.
|
|
||||||
* */
|
|
||||||
|
|
||||||
|
|
||||||
void FeedsModelFeed::updateMessages(const QList<Message> &messages) {
|
void FeedsModelFeed::updateMessages(const QList<Message> &messages) {
|
||||||
int feed_id = id();
|
int feed_id = id();
|
||||||
QSqlDatabase database = qApp->database()->connection("FeedsModelFeed", DatabaseFactory::FromSettings);
|
QSqlDatabase database = qApp->database()->connection("FeedsModelFeed", DatabaseFactory::FromSettings);
|
||||||
|
|
@ -476,12 +463,12 @@ void FeedsModelFeed::updateMessages(const QList<Message> &messages) {
|
||||||
// Used to insert new messages.
|
// Used to insert new messages.
|
||||||
query_insert.setForwardOnly(true);
|
query_insert.setForwardOnly(true);
|
||||||
query_insert.prepare("INSERT INTO Messages "
|
query_insert.prepare("INSERT INTO Messages "
|
||||||
"(feed, title, url, author, date_created, contents) "
|
"(feed, title, url, author, date_created, contents, enclosures) "
|
||||||
"VALUES (:feed, :title, :url, :author, :date_created, :contents);");
|
"VALUES (:feed, :title, :url, :author, :date_created, :contents, :enclosures);");
|
||||||
|
|
||||||
if (remove_duplicates) {
|
if (remove_duplicates) {
|
||||||
query_update.setForwardOnly(true);
|
query_update.setForwardOnly(true);
|
||||||
query_update.prepare("UPDATE Messages SET contents = :contents WHERE id = :id;");
|
query_update.prepare("UPDATE Messages SET contents = :contents enclosures = :enclosures WHERE id = :id;");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!database.transaction()) {
|
if (!database.transaction()) {
|
||||||
|
|
@ -528,6 +515,7 @@ void FeedsModelFeed::updateMessages(const QList<Message> &messages) {
|
||||||
query_insert.bindValue(":author", message.m_author);
|
query_insert.bindValue(":author", message.m_author);
|
||||||
query_insert.bindValue(":date_created", message.m_created.toMSecsSinceEpoch());
|
query_insert.bindValue(":date_created", message.m_created.toMSecsSinceEpoch());
|
||||||
query_insert.bindValue(":contents", message.m_contents);
|
query_insert.bindValue(":contents", message.m_contents);
|
||||||
|
query_insert.bindValue(":enclosures", Enclosures::encodeEnclosuresToString(message.m_enclosures));
|
||||||
|
|
||||||
if (query_insert.exec() && query_insert.numRowsAffected() == 1) {
|
if (query_insert.exec() && query_insert.numRowsAffected() == 1) {
|
||||||
setStatus(NewMessages);
|
setStatus(NewMessages);
|
||||||
|
|
@ -543,6 +531,7 @@ void FeedsModelFeed::updateMessages(const QList<Message> &messages) {
|
||||||
// messages and there is exactly ONE existing duplicate.
|
// messages and there is exactly ONE existing duplicate.
|
||||||
query_update.bindValue(":id", ids.at(0));
|
query_update.bindValue(":id", ids.at(0));
|
||||||
query_update.bindValue(":contents", message.m_contents);
|
query_update.bindValue(":contents", message.m_contents);
|
||||||
|
query_update.bindValue(":enclosures", Enclosures::encodeEnclosuresToString(message.m_enclosures));
|
||||||
query_update.exec();
|
query_update.exec();
|
||||||
query_update.finish();
|
query_update.finish();
|
||||||
|
|
||||||
|
|
@ -557,6 +546,7 @@ void FeedsModelFeed::updateMessages(const QList<Message> &messages) {
|
||||||
query_insert.bindValue(":author", message.m_author);
|
query_insert.bindValue(":author", message.m_author);
|
||||||
query_insert.bindValue(":date_created", message.m_created.toMSecsSinceEpoch());
|
query_insert.bindValue(":date_created", message.m_created.toMSecsSinceEpoch());
|
||||||
query_insert.bindValue(":contents", message.m_contents);
|
query_insert.bindValue(":contents", message.m_contents);
|
||||||
|
query_insert.bindValue(":enclosures", Enclosures::encodeEnclosuresToString(message.m_enclosures));
|
||||||
|
|
||||||
if (query_insert.exec() && query_insert.numRowsAffected() == 1) {
|
if (query_insert.exec() && query_insert.numRowsAffected() == 1) {
|
||||||
setStatus(NewMessages);
|
setStatus(NewMessages);
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,7 @@ Message MessagesModel::messageAt(int row_index) const {
|
||||||
// Fill Message object with details.
|
// Fill Message object with details.
|
||||||
message.m_author = rec.value(MSG_DB_AUTHOR_INDEX).toString();
|
message.m_author = rec.value(MSG_DB_AUTHOR_INDEX).toString();
|
||||||
message.m_contents = rec.value(MSG_DB_CONTENTS_INDEX).toString();
|
message.m_contents = rec.value(MSG_DB_CONTENTS_INDEX).toString();
|
||||||
|
message.m_enclosures = Enclosures::decodeEnclosuresFromString(rec.value(MSG_DB_ENCLOSURES_INDEX).toString());
|
||||||
message.m_title = rec.value(MSG_DB_TITLE_INDEX).toString();
|
message.m_title = rec.value(MSG_DB_TITLE_INDEX).toString();
|
||||||
message.m_url = rec.value(MSG_DB_URL_INDEX).toString();
|
message.m_url = rec.value(MSG_DB_URL_INDEX).toString();
|
||||||
message.m_created = TextFactory::parseDateTime(rec.value(MSG_DB_DCREATED_INDEX).value<qint64>()).toLocalTime();
|
message.m_created = TextFactory::parseDateTime(rec.value(MSG_DB_DCREATED_INDEX).value<qint64>()).toLocalTime();
|
||||||
|
|
|
||||||
|
|
@ -27,27 +27,27 @@
|
||||||
|
|
||||||
|
|
||||||
// Represents single enclosure.
|
// Represents single enclosure.
|
||||||
class Enclosure {
|
class Enclosures {
|
||||||
public:
|
public:
|
||||||
explicit Enclosure() {
|
static QStringList decodeEnclosuresFromString(const QString &enclosures_data) {
|
||||||
m_url = m_title = "";
|
QStringList enclosures;
|
||||||
}
|
|
||||||
|
|
||||||
static QList<Enclosure> decodeEnclosuresFromString(const QString &enclosures_data) {
|
|
||||||
QList<Enclosure> enclosures;
|
|
||||||
|
|
||||||
foreach (const QString &single_enclosure, enclosures_data.split(ENCLOSURES_OUTER_SEPARATOR, QString::SkipEmptyParts)) {
|
foreach (const QString &single_enclosure, enclosures_data.split(ENCLOSURES_OUTER_SEPARATOR, QString::SkipEmptyParts)) {
|
||||||
Enclosure final_enclosure;
|
enclosures.append(QByteArray::fromBase64(single_enclosure.toLocal8Bit()));
|
||||||
final_enclosure.m_url = QByteArray::fromBase64(single_enclosure.toUtf8());
|
|
||||||
|
|
||||||
enclosures.append(final_enclosure);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return enclosures;
|
return enclosures;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString m_url;
|
static QString encodeEnclosuresToString(const QStringList &enclosures) {
|
||||||
QString m_title;
|
QStringList enclosures_str;
|
||||||
|
|
||||||
|
foreach (const QString &enclosure, enclosures) {
|
||||||
|
enclosures_str.append(enclosure.toLocal8Bit().toBase64());
|
||||||
|
}
|
||||||
|
|
||||||
|
return enclosures_str.join(QString(ENCLOSURES_OUTER_SEPARATOR));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Represents single message.
|
// Represents single message.
|
||||||
|
|
@ -55,7 +55,7 @@ class Message {
|
||||||
public:
|
public:
|
||||||
explicit Message() {
|
explicit Message() {
|
||||||
m_title = m_url = m_author = m_contents = "";
|
m_title = m_url = m_author = m_contents = "";
|
||||||
m_enclosures = QList<Enclosure>();
|
m_enclosures = QStringList();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString m_title;
|
QString m_title;
|
||||||
|
|
@ -64,7 +64,7 @@ class Message {
|
||||||
QString m_contents;
|
QString m_contents;
|
||||||
QDateTime m_created;
|
QDateTime m_created;
|
||||||
|
|
||||||
QList<Enclosure> m_enclosures;
|
QStringList m_enclosures;
|
||||||
|
|
||||||
// Is true if "created" date was obtained directly
|
// Is true if "created" date was obtained directly
|
||||||
// from the feed, otherwise is false
|
// from the feed, otherwise is false
|
||||||
|
|
|
||||||
|
|
@ -70,12 +70,21 @@ QList<Message> ParsingFactory::parseAsATOM10(const QString &data) {
|
||||||
// Deal with link.
|
// Deal with link.
|
||||||
QDomNodeList elem_links = message_item.toElement().elementsByTagName("link");
|
QDomNodeList elem_links = message_item.toElement().elementsByTagName("link");
|
||||||
|
|
||||||
for (int i = 0; i < elem_links.size(); i++) {
|
for (int i = 0; i < elem_links.size(); i++) {
|
||||||
new_message.m_url = elem_links.at(i).attributes().namedItem("href").toAttr().value();
|
QDomElement link = elem_links.at(i).toElement();
|
||||||
|
|
||||||
if (!new_message.m_url.isNull() && !new_message.m_url.isEmpty()) {
|
if (link.attribute("rel") == "enclosure") {
|
||||||
break;
|
new_message.m_enclosures.append(link.attribute("href"));
|
||||||
|
|
||||||
|
qDebug("Adding enclosure '%s' for the message.", qPrintable(new_message.m_enclosures.last()));
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
new_message.m_url = link.attribute("href");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new_message.m_url.isEmpty() && !new_message.m_enclosures.isEmpty()) {
|
||||||
|
new_message.m_url = new_message.m_enclosures.first();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deal with authors.
|
// Deal with authors.
|
||||||
|
|
@ -193,6 +202,7 @@ QList<Message> ParsingFactory::parseAsRSS20(const QString &data) {
|
||||||
// Deal with titles & descriptions.
|
// Deal with titles & descriptions.
|
||||||
QString elem_title = message_item.namedItem("title").toElement().text().simplified();
|
QString elem_title = message_item.namedItem("title").toElement().text().simplified();
|
||||||
QString elem_description = message_item.namedItem("description").toElement().text();
|
QString elem_description = message_item.namedItem("description").toElement().text();
|
||||||
|
QString elem_enclosure = message_item.namedItem("enclosure").toElement().attribute("url");
|
||||||
|
|
||||||
if (elem_description.isEmpty()) {
|
if (elem_description.isEmpty()) {
|
||||||
elem_description = message_item.namedItem("encoded").toElement().text();
|
elem_description = message_item.namedItem("encoded").toElement().text();
|
||||||
|
|
@ -216,6 +226,12 @@ QList<Message> ParsingFactory::parseAsRSS20(const QString &data) {
|
||||||
new_message.m_contents = elem_description;
|
new_message.m_contents = elem_description;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!elem_enclosure.isEmpty()) {
|
||||||
|
new_message.m_enclosures.append(elem_enclosure);
|
||||||
|
|
||||||
|
qDebug("Adding enclosure '%s' for the message.", qPrintable(elem_enclosure));
|
||||||
|
}
|
||||||
|
|
||||||
// Deal with link and author.
|
// Deal with link and author.
|
||||||
new_message.m_url = message_item.namedItem("link").toElement().text();
|
new_message.m_url = message_item.namedItem("link").toElement().text();
|
||||||
new_message.m_author = message_item.namedItem("author").toElement().text();
|
new_message.m_author = message_item.namedItem("author").toElement().text();
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ FormBackupDatabaseSettings::FormBackupDatabaseSettings(QWidget *parent) : QDialo
|
||||||
connect(m_ui->m_txtBackupName->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(checkOkButton()));
|
connect(m_ui->m_txtBackupName->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(checkOkButton()));
|
||||||
connect(m_ui->m_btnSelectFolder, SIGNAL(clicked()), this, SLOT(selectFolder()));
|
connect(m_ui->m_btnSelectFolder, SIGNAL(clicked()), this, SLOT(selectFolder()));
|
||||||
|
|
||||||
selectFolder(qApp->documentsFolderPath());
|
selectFolder(qApp->documentsFolderPath());
|
||||||
m_ui->m_txtBackupName->lineEdit()->setText(QString(APP_LOW_NAME) + "_" + QDateTime::currentDateTime().toString("yyyyMMddHHmm"));
|
m_ui->m_txtBackupName->lineEdit()->setText(QString(APP_LOW_NAME) + "_" + QDateTime::currentDateTime().toString("yyyyMMddHHmm"));
|
||||||
m_ui->m_lblResult->setStatus(WidgetWithStatus::Warning, tr("No operation executed yet."), tr("No operation executed yet."));
|
m_ui->m_lblResult->setStatus(WidgetWithStatus::Warning, tr("No operation executed yet."), tr("No operation executed yet."));
|
||||||
|
|
||||||
|
|
@ -56,19 +56,15 @@ FormBackupDatabaseSettings::~FormBackupDatabaseSettings() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormBackupDatabaseSettings::performBackup() {
|
void FormBackupDatabaseSettings::performBackup() {
|
||||||
if (qApp->backupDatabaseSettings(m_ui->m_checkBackupDatabase->isChecked(),
|
try {
|
||||||
m_ui->m_checkBackupSettings->isChecked(),
|
qApp->backupDatabaseSettings(m_ui->m_checkBackupDatabase->isChecked(), m_ui->m_checkBackupSettings->isChecked(),
|
||||||
m_ui->m_lblSelectFolder->label()->text(),
|
m_ui->m_lblSelectFolder->label()->text(), m_ui->m_txtBackupName->lineEdit()->text());
|
||||||
m_ui->m_txtBackupName->lineEdit()->text())) {
|
|
||||||
m_ui->m_lblResult->setStatus(WidgetWithStatus::Ok,
|
m_ui->m_lblResult->setStatus(WidgetWithStatus::Ok,
|
||||||
tr("Backup was created successfully and stored in target folder."),
|
tr("Backup was created successfully and stored in target folder."),
|
||||||
tr("Backup was created successfully."));
|
tr("Backup was created successfully."));
|
||||||
}
|
}
|
||||||
else {
|
catch (ApplicationException &ex) {
|
||||||
m_ui->m_lblResult->setStatus(WidgetWithStatus::Error,
|
m_ui->m_lblResult->setStatus(WidgetWithStatus::Error, ex.message(), tr("Backup failed."));
|
||||||
tr("Backup failed, database and/or settings is probably not backed."),
|
|
||||||
tr("Backup failed. Check the output folder if your database\nand/or "
|
|
||||||
"settings were backed or not. Also make sure that target foder is writable."));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="m_groupFile">
|
<widget class="QGroupBox" name="m_groupFile">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string/>
|
<string>Output folder</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QFormLayout" name="formLayout">
|
<layout class="QFormLayout" name="formLayout">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
|
|
@ -125,18 +125,18 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
|
||||||
<class>LabelWithStatus</class>
|
|
||||||
<extends>QWidget</extends>
|
|
||||||
<header>labelwithstatus.h</header>
|
|
||||||
<container>1</container>
|
|
||||||
</customwidget>
|
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>LineEditWithStatus</class>
|
<class>LineEditWithStatus</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header>lineeditwithstatus.h</header>
|
<header>lineeditwithstatus.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>LabelWithStatus</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>labelwithstatus.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|
|
||||||
|
|
@ -50,20 +50,21 @@ FormRestoreDatabaseSettings::~FormRestoreDatabaseSettings() {
|
||||||
void FormRestoreDatabaseSettings::performRestoration() {
|
void FormRestoreDatabaseSettings::performRestoration() {
|
||||||
m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
|
m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
|
||||||
|
|
||||||
if (qApp->restoreDatabaseSettings(m_ui->m_groupDatabase->isChecked(),
|
try {
|
||||||
m_ui->m_groupSettings->isChecked(),
|
qApp->restoreDatabaseSettings(m_ui->m_groupDatabase->isChecked(),
|
||||||
m_ui->m_listDatabase->currentRow() >= 0 ?
|
m_ui->m_groupSettings->isChecked(),
|
||||||
|
m_ui->m_listDatabase->currentRow() >= 0 ?
|
||||||
m_ui->m_listDatabase->currentItem()->data(Qt::UserRole).toString() :
|
m_ui->m_listDatabase->currentItem()->data(Qt::UserRole).toString() :
|
||||||
QString(),
|
QString(),
|
||||||
m_ui->m_listSettings->currentRow() >= 0 ?
|
m_ui->m_listSettings->currentRow() >= 0 ?
|
||||||
m_ui->m_listSettings->currentItem()->data(Qt::UserRole).toString() :
|
m_ui->m_listSettings->currentItem()->data(Qt::UserRole).toString() :
|
||||||
QString())) {
|
QString());
|
||||||
m_btnRestart->setEnabled(true);
|
m_btnRestart->setEnabled(true);
|
||||||
m_ui->m_lblResult->setStatus(WidgetWithStatus::Ok, tr("Restoration was initiated. Restart to proceed."),
|
m_ui->m_lblResult->setStatus(WidgetWithStatus::Ok, tr("Restoration was initiated. Restart to proceed."),
|
||||||
tr("You need to restart application for restoration process to finish."));
|
tr("You need to restart application for restoration process to finish."));
|
||||||
}
|
}
|
||||||
else {
|
catch (ApplicationException &ex) {
|
||||||
m_ui->m_lblResult->setStatus(WidgetWithStatus::Error, tr("Restoration was not initiated successfully."),
|
m_ui->m_lblResult->setStatus(WidgetWithStatus::Error, ex.message(),
|
||||||
tr("Database and/or settings were not copied to restoration folder successully."));
|
tr("Database and/or settings were not copied to restoration folder successully."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
<item row="0" column="0" colspan="2">
|
<item row="0" column="0" colspan="2">
|
||||||
<widget class="QGroupBox" name="m_groupFile">
|
<widget class="QGroupBox" name="m_groupFile">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string/>
|
<string>Source folder</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QFormLayout" name="formLayout">
|
<layout class="QFormLayout" name="formLayout">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
|
|
|
||||||
|
|
@ -44,8 +44,7 @@ WidgetWithStatus::WidgetWithStatus(QWidget *parent)
|
||||||
WidgetWithStatus::~WidgetWithStatus() {
|
WidgetWithStatus::~WidgetWithStatus() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WidgetWithStatus::setStatus(WidgetWithStatus::StatusType status,
|
void WidgetWithStatus::setStatus(WidgetWithStatus::StatusType status, const QString &tooltip_text) {
|
||||||
const QString &tooltip_text) {
|
|
||||||
m_status = status;
|
m_status = status;
|
||||||
|
|
||||||
switch (status) {
|
switch (status) {
|
||||||
|
|
|
||||||
|
|
@ -72,18 +72,18 @@ DownloadManager *Application::downloadManager() {
|
||||||
return m_downloadManager;
|
return m_downloadManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Application::backupDatabaseSettings(bool backup_database, bool backup_settings,
|
void Application::backupDatabaseSettings(bool backup_database, bool backup_settings,
|
||||||
const QString &target_path, const QString &backup_name) {
|
const QString &target_path, const QString &backup_name) {
|
||||||
if (!QFileInfo(target_path).isWritable()) {
|
if (!QFileInfo(target_path).isWritable()) {
|
||||||
return false;
|
throw ApplicationException(tr("Output folder is not writable."));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool final_result = true;
|
|
||||||
|
|
||||||
if (backup_settings) {
|
if (backup_settings) {
|
||||||
settings()->sync();
|
settings()->sync();
|
||||||
final_result = final_result && IOFactory::copyFile(settings()->fileName(),
|
|
||||||
target_path + QDir::separator() + backup_name + BACKUP_SUFFIX_SETTINGS);
|
if (!IOFactory::copyFile(settings()->fileName(), target_path + QDir::separator() + backup_name + BACKUP_SUFFIX_SETTINGS)) {
|
||||||
|
throw ApplicationException(tr("Settings file not copied to output folder successfully."));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (backup_database &&
|
if (backup_database &&
|
||||||
|
|
@ -91,26 +91,26 @@ bool Application::backupDatabaseSettings(bool backup_database, bool backup_setti
|
||||||
database()->activeDatabaseDriver() == DatabaseFactory::SQLITE_MEMORY)) {
|
database()->activeDatabaseDriver() == DatabaseFactory::SQLITE_MEMORY)) {
|
||||||
// We need to save the database first.
|
// We need to save the database first.
|
||||||
database()->saveDatabase();
|
database()->saveDatabase();
|
||||||
final_result = final_result && IOFactory::copyFile(database()->sqliteDatabaseFilePath(),
|
|
||||||
target_path + QDir::separator() + backup_name + BACKUP_SUFFIX_DATABASE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return final_result;
|
if (!IOFactory::copyFile(database()->sqliteDatabaseFilePath(), target_path + QDir::separator() + backup_name + BACKUP_SUFFIX_DATABASE)) {
|
||||||
|
throw ApplicationException(tr("Database file not copied to output folder successfully."));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Application::restoreDatabaseSettings(bool restore_database, bool restore_settings,
|
void Application::restoreDatabaseSettings(bool restore_database, bool restore_settings,
|
||||||
const QString &source_database_file_path, const QString &source_settings_file_path) {
|
const QString &source_database_file_path, const QString &source_settings_file_path) {
|
||||||
bool result = true;
|
|
||||||
|
|
||||||
if (restore_database) {
|
if (restore_database) {
|
||||||
result &= qApp->database()->initiateRestoration(source_database_file_path);
|
if (!qApp->database()->initiateRestoration(source_database_file_path)) {
|
||||||
|
throw ApplicationException(tr("Database restoration was not initiated. Make sure that output folder is writable."));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (restore_settings) {
|
if (restore_settings) {
|
||||||
result &= qApp->settings()->initiateRestoration(source_settings_file_path);
|
if (!qApp->settings()->initiateRestoration(source_settings_file_path)) {
|
||||||
|
throw ApplicationException(tr("Settings restoration was not initiated. Make sure that output folder is writable."));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::processExecutionMessage(const QString &message) {
|
void Application::processExecutionMessage(const QString &message) {
|
||||||
|
|
@ -243,3 +243,13 @@ void Application::restart() {
|
||||||
m_shouldRestart = true;
|
m_shouldRestart = true;
|
||||||
quit();
|
quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ApplicationException::ApplicationException(const QString &message) : m_message(message) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplicationException::~ApplicationException() {
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ApplicationException::message() const {
|
||||||
|
return m_message;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,17 @@ class FormMain;
|
||||||
class IconFactory;
|
class IconFactory;
|
||||||
class QAction;
|
class QAction;
|
||||||
|
|
||||||
|
class ApplicationException {
|
||||||
|
public:
|
||||||
|
explicit ApplicationException(const QString &message = QString());
|
||||||
|
virtual ~ApplicationException();
|
||||||
|
|
||||||
|
QString message() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_message;
|
||||||
|
};
|
||||||
|
|
||||||
class Application : public QtSingleApplication {
|
class Application : public QtSingleApplication {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
|
@ -127,8 +138,8 @@ class Application : public QtSingleApplication {
|
||||||
return IOFactory::getSystemFolder(SYSTEM_FOLDER_ENUM::HomeLocation);
|
return IOFactory::getSystemFolder(SYSTEM_FOLDER_ENUM::HomeLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool backupDatabaseSettings(bool backup_database, bool backup_settings, const QString &target_path, const QString &backup_name);
|
void backupDatabaseSettings(bool backup_database, bool backup_settings, const QString &target_path, const QString &backup_name);
|
||||||
bool restoreDatabaseSettings(bool restore_database, bool restore_settings,
|
void restoreDatabaseSettings(bool restore_database, bool restore_settings,
|
||||||
const QString &source_database_file_path = QString(),
|
const QString &source_database_file_path = QString(),
|
||||||
const QString &source_settings_file_path = QString());
|
const QString &source_settings_file_path = QString());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -218,6 +218,10 @@ void WebBrowser::navigateToMessages(const QList<Message> &messages) {
|
||||||
QString single_message_layout = factory->currentMarkup();
|
QString single_message_layout = factory->currentMarkup();
|
||||||
|
|
||||||
foreach (const Message &message, messages) {
|
foreach (const Message &message, messages) {
|
||||||
|
QString enclosures = message.m_enclosures.join("</br>");
|
||||||
|
|
||||||
|
// TODO: upravit skiny aby brali další argument
|
||||||
|
|
||||||
messages_layout.append(single_message_layout.arg(message.m_title,
|
messages_layout.append(single_message_layout.arg(message.m_title,
|
||||||
tr("Written by ") + (message.m_author.isEmpty() ?
|
tr("Written by ") + (message.m_author.isEmpty() ?
|
||||||
tr("uknown author") :
|
tr("uknown author") :
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue