Merge branch 'dev'
This commit is contained in:
commit
99e53c3309
46
.appveyor.yml
Executable file
46
.appveyor.yml
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
version: 666.{build}
|
||||||
|
skip_tags: true
|
||||||
|
image: Visual Studio 2013
|
||||||
|
clone_depth: 1
|
||||||
|
clone_folder: c:\rssguard
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
- dev
|
||||||
|
except:
|
||||||
|
- build-artifacts
|
||||||
|
|
||||||
|
environment:
|
||||||
|
QTDIR: 'C:\Qt\5.7\msvc2013'
|
||||||
|
QMAKESPEC: win32-msvc2013
|
||||||
|
COMPILERBAT: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86'
|
||||||
|
access_token:
|
||||||
|
secure: XCWdr9wPgK4gm6289WXCg2vtMA02eBSnj6eKHC+ps6Z5lgw0jsK09UQ5y9E9ZFwS
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- git submodule update --init --recursive
|
||||||
|
- set "QT_PLUGIN_PATH=%QTDIR%\plugins"
|
||||||
|
- set "PATH=%QTDIR%\bin;%PATH%"
|
||||||
|
- '%COMPILERBAT%'
|
||||||
|
- dir
|
||||||
|
- cd ..
|
||||||
|
- mkdir rssguard-build
|
||||||
|
- cd rssguard-build
|
||||||
|
- C:\Qt\5.7\msvc2013\bin\qmake.exe C:\rssguard
|
||||||
|
- nmake
|
||||||
|
- nmake windows_all
|
||||||
|
|
||||||
|
on_success:
|
||||||
|
- dir
|
||||||
|
- git clone -q --depth=1 --branch=build-artifacts https://github.com/martinrotter/rssguard.git c:\rssguard-artifacts
|
||||||
|
- git config --global credential.helper store
|
||||||
|
- ps: Add-Content "$env:USERPROFILE\.git-credentials" "https://$($env:access_token):x-oauth-basic@github.com`n"
|
||||||
|
- git config --global user.email "rotter.martinos@gmail.com"
|
||||||
|
- git config --global user.name "martinrotter"
|
||||||
|
- cd ..\rssguard-build
|
||||||
|
- for /f "tokens=*" %%F in ('dir /s /b *.7z') do curl --upload-file %%F https://transfer.sh/rssguard-win32.7z --silent >> ..\rssguard-artifacts\windows-builds.txt
|
||||||
|
- cd ..\rssguard-artifacts
|
||||||
|
- git add *.*
|
||||||
|
- git commit -m "New files."
|
||||||
|
- git push origin build-artifacts
|
19
.travis.yml
19
.travis.yml
@ -1,10 +1,12 @@
|
|||||||
dist: trusty
|
|
||||||
|
|
||||||
language: cpp
|
language: cpp
|
||||||
|
osx_image: xcode7.3
|
||||||
|
sudo: required
|
||||||
|
dist: trusty
|
||||||
|
|
||||||
os:
|
os:
|
||||||
- linux
|
- linux
|
||||||
|
- osx
|
||||||
|
|
||||||
compiler:
|
compiler:
|
||||||
- gcc
|
- gcc
|
||||||
|
|
||||||
@ -12,15 +14,10 @@ git:
|
|||||||
submodules: false
|
submodules: false
|
||||||
depth: 3
|
depth: 3
|
||||||
|
|
||||||
before_install:
|
before_install: ./resources/scripts/.travis-before-install.sh
|
||||||
- sudo add-apt-repository ppa:beineri/opt-qt57-trusty -y
|
|
||||||
- sudo apt-get update
|
|
||||||
- sudo apt-get -y install qt57tools qt57base qt57webengine
|
|
||||||
|
|
||||||
install: true
|
install: true
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- source /opt/qt57/bin/qt57-env.sh
|
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./resources/scripts/.travis-install-linux.sh ; fi
|
||||||
- mkdir rssguard-build && cd rssguard-build
|
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./resources/scripts/.travis-install-osx.sh ; fi
|
||||||
- qmake ..
|
|
||||||
- make
|
|
@ -1,7 +1,8 @@
|
|||||||
RSS Guard
|
RSS Guard
|
||||||
=========
|
=========
|
||||||
|
|
||||||
[![Build status](https://img.shields.io/travis/martinrotter/rssguard.svg?maxAge=360)](https://travis-ci.org/martinrotter/rssguard)
|
[![AppVeyor](https://img.shields.io/appveyor/ci/martinrotter/rssguard.svg?maxAge=360)](https://ci.appveyor.com/project/martinrotter/rssguard)
|
||||||
|
[![Travis CI](https://img.shields.io/travis/martinrotter/rssguard.svg?maxAge=360)](https://travis-ci.org/martinrotter/rssguard)
|
||||||
[![Total downloads](https://img.shields.io/github/downloads/martinrotter/rssguard/total.svg?maxAge=360)](#)
|
[![Total downloads](https://img.shields.io/github/downloads/martinrotter/rssguard/total.svg?maxAge=360)](#)
|
||||||
[![Version](https://img.shields.io/github/release/martinrotter/rssguard.svg?maxAge=360)](#)
|
[![Version](https://img.shields.io/github/release/martinrotter/rssguard.svg?maxAge=360)](#)
|
||||||
[![GitHub issues](https://img.shields.io/github/issues/martinrotter/rssguard.svg?maxAge=360)](#)
|
[![GitHub issues](https://img.shields.io/github/issues/martinrotter/rssguard.svg?maxAge=360)](#)
|
||||||
@ -61,6 +62,7 @@ Downloads
|
|||||||
* [official downloads](https://github.com/martinrotter/rssguard/releases),
|
* [official downloads](https://github.com/martinrotter/rssguard/releases),
|
||||||
* alternative downloads:
|
* alternative downloads:
|
||||||
* [Archlinux AUR package](https://aur.archlinux.org/packages/rssguard/),
|
* [Archlinux AUR package](https://aur.archlinux.org/packages/rssguard/),
|
||||||
|
* [Automatically generated test builds](https://github.com/martinrotter/rssguard/tree/build-artifacts),
|
||||||
* [OBS/development releases](https://build.opensuse.org/package/show/home:skunkos:rssguard/rssguard-git) (click "Download package" in top/right corner of the website).
|
* [OBS/development releases](https://build.opensuse.org/package/show/home:skunkos:rssguard/rssguard-git) (click "Download package" in top/right corner of the website).
|
||||||
|
|
||||||
[![Alternative RSS Guard downloads.](http://www.instalki.pl/img/buttons/en/download_dark.png)](http://www.instalki.pl/programy/download/Windows/czytniki_RSS/RSS_Guard.html)
|
[![Alternative RSS Guard downloads.](http://www.instalki.pl/img/buttons/en/download_dark.png)](http://www.instalki.pl/programy/download/Windows/czytniki_RSS/RSS_Guard.html)
|
||||||
@ -73,7 +75,7 @@ Features
|
|||||||
--------
|
--------
|
||||||
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](http://qt-project.org/) and it supports these operating systems:
|
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](http://qt-project.org/) and it supports these operating systems:
|
||||||
|
|
||||||
* Windows XP and newer,
|
* Windows Vista and newer,
|
||||||
* GNU/Linux,
|
* GNU/Linux,
|
||||||
* Mac OS X,
|
* Mac OS X,
|
||||||
* xBSD (possibly),
|
* xBSD (possibly),
|
||||||
|
@ -2176,10 +2176,6 @@ Přesto chcete soubor smazat?</translation>
|
|||||||
<source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.io/licensing/">qt.io/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2015 The Qt Company Ltd and other contributors.</p><p>Qt and the Qt logo are trademarks of Digia Plc and/or its subsidiary(-ies).</p><p>Qt is developed as an open source project on <a href="http://qt-project.org/">qt-project.org</a>.</p><p>Qt is a Digia product. See <a href="http://qt.io/">qt.io</a> for more information.</p></source>
|
<source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.io/licensing/">qt.io/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2015 The Qt Company Ltd and other contributors.</p><p>Qt and the Qt logo are trademarks of Digia Plc and/or its subsidiary(-ies).</p><p>Qt is developed as an open source project on <a href="http://qt-project.org/">qt-project.org</a>.</p><p>Qt is a Digia product. See <a href="http://qt.io/">qt.io</a> for more information.</p></source>
|
||||||
<translation><p>Qt je sadou softwarových nástrojů C++ určených pro víceplatformní vývoj aplikací.</p><p>Qt poskytuje snadnou přenositelnost a jednotný zdrojový kód pro MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux a všechny hlavní prodejní varianty systému Unix. Qt je rovněž dostupné pro vestavěná zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné s třemi rozdílnými licencemi, aby vyhovělo širokým řadám našich uživatelů.</p>Qt s naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, u kterého si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami anebo z jiného důvodu nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt s licencí GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem) za předpokladu, že můžete souhlasit s požadavky a podmínkami GNU LGPL verze 2.1.</p><p>Qt s licencí GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochotni souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Více informací najdete na <a href="http://qt.io/licensing/">qt.nokia.com/products/licensing</a>.</p><p>Autorské právo (C) 2015 The Qt Company Ltd a/nebo její dceřinná(é) společnost(i) a další přispěvatelé.</p><p>Qt a logo Qt jsou obchodní značky Digia Plc a/nebo její dceřinná(é) společnost(i).</p><p>Qt je vyvíjeno jako projekt s otevřeným zdrojovým kódem na <a href="http://qt-project.org/">qt-project.org</a>.</p><p>Qt je výrobkem společnosti Digia. Další informace najdete na <a href="http://qt.io/">qt.io</a>. href="http://qt.io/">qt.nokia.com</a>.</p></translation>
|
<translation><p>Qt je sadou softwarových nástrojů C++ určených pro víceplatformní vývoj aplikací.</p><p>Qt poskytuje snadnou přenositelnost a jednotný zdrojový kód pro MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux a všechny hlavní prodejní varianty systému Unix. Qt je rovněž dostupné pro vestavěná zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné s třemi rozdílnými licencemi, aby vyhovělo širokým řadám našich uživatelů.</p>Qt s naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, u kterého si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami anebo z jiného důvodu nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt s licencí GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem) za předpokladu, že můžete souhlasit s požadavky a podmínkami GNU LGPL verze 2.1.</p><p>Qt s licencí GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochotni souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Více informací najdete na <a href="http://qt.io/licensing/">qt.nokia.com/products/licensing</a>.</p><p>Autorské právo (C) 2015 The Qt Company Ltd a/nebo její dceřinná(é) společnost(i) a další přispěvatelé.</p><p>Qt a logo Qt jsou obchodní značky Digia Plc a/nebo její dceřinná(é) společnost(i).</p><p>Qt je vyvíjeno jako projekt s otevřeným zdrojovým kódem na <a href="http://qt-project.org/">qt-project.org</a>.</p><p>Qt je výrobkem společnosti Digia. Další informace najdete na <a href="http://qt.io/">qt.io</a>. href="http://qt.io/">qt.nokia.com</a>.</p></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.io/licensing/">qt.io/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2015 The Qt Company Ltd and other contributors.</p><p>Qt and the Qt logo are trademarks of Digia Plc and/or its subsidiary(-ies).</p><p>Qt is developed as an open source project on <a href="http://qt-project.org/">qt-project.org</a>.</p><p>Qt is a Digia product. See <a href="http://qt.io/">qt.io</a> for more information.</p></source>
|
|
||||||
<translation><p>Qt je sadou softwarových nástrojů C++ určených pro víceplatformní vývoj aplikací.</p><p>Qt poskytuje snadnou přenositelnost a jednotný zdrojový kód pro MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux a všechny hlavní prodejní varianty systému Unix. Qt je rovněž dostupné pro vestavěná zařízení jako Qt pro Embedded Linux a Qt pro Windows CE.</p><p>Qt je dostupné s třemi rozdílnými licencemi, aby vyhovělo širokým řadám našich uživatelů.</p>Qt s naší obchodní licenční smlouvou je vhodné pro vývoj soukromého/obchodního software, u kterého si nepřejete sdílet jakýkoli zdrojový kód se třetími stranami anebo z jiného důvodu nemůžete vyhovět podmínkám GNU LGPL ve verzi 2.1 nebo GNU GPL ve verzi 3.0.</p><p>Qt s licencí GNU LGPL ve verzi 2.1 je vhodné pro vývoj Qt aplikací (soukromých nebo s otevřeným zdrojovým kódem) za předpokladu, že můžete souhlasit s požadavky a podmínkami GNU LGPL verze 2.1.</p><p>Qt s licencí GNU General Public License ve verzi 3.0 je vhodné pro vývoj aplikací Qt, u nichž si přejete použít takovou aplikaci ve spojení se software, který podléhá požadavkům GNU GPL ve verzi 3.0, nebo kde jste jinak ochotni souhlasit s podmínkami GNU GPL ve verzi 3.0.</p><p>Více informací najdete na <a href="http://qt.io/licensing/">qt.nokia.com/products/licensing</a>.</p><p>Autorské právo (C) 2015 The Qt Company Ltd a/nebo její dceřinná(é) společnost(i).</p><p>Qt je výrobkem společnosti Nokia. Další informace najdete na <a href="http://qt.io/">qt.nokia.com</a>.</p></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>About Qt</source>
|
<source>About Qt</source>
|
||||||
<translation>O Qt</translation>
|
<translation>O Qt</translation>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>@ICON@</string>
|
<string>@ICON@</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>org.rssguard.RSSGuard</string>
|
<string>org.martinrotter.rssguard</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
|
@ -25,5 +25,5 @@
|
|||||||
!define MUI_ICON "@PWD@\resources\graphics\@APP_LOW_NAME@.ico"
|
!define MUI_ICON "@PWD@\resources\graphics\@APP_LOW_NAME@.ico"
|
||||||
!define MUI_UNICON "@PWD@\resources\graphics\@APP_LOW_NAME@.ico"
|
!define MUI_UNICON "@PWD@\resources\graphics\@APP_LOW_NAME@.ico"
|
||||||
!define PATCH "0"
|
!define PATCH "0"
|
||||||
!define OUTPUT_FILE "@OUT_PWD@\@APP_LOW_NAME@-@APP_VERSION@-win32.exe"
|
!define OUTPUT_FILE "@OUT_PWD@\@APP_LOW_NAME@-@APP_VERSION@-@APP_REVISION@-win32.exe"
|
||||||
!define BINARY_TREE "@OUT_PWD@\app"
|
!define BINARY_TREE "@OUT_PWD@\app"
|
15
resources/scripts/.travis-before-install.sh
Executable file
15
resources/scripts/.travis-before-install.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if test "$TRAVIS_OS_NAME" = "osx"; then
|
||||||
|
# Mac OS X.
|
||||||
|
brew update
|
||||||
|
brew install qt5
|
||||||
|
brew link --force qt5
|
||||||
|
brew install curl
|
||||||
|
brew link --force curl
|
||||||
|
else
|
||||||
|
# Linux.
|
||||||
|
sudo add-apt-repository ppa:beineri/opt-qt57-trusty -y
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get -y install qt57tools qt57base qt57webengine
|
||||||
|
fi
|
7
resources/scripts/.travis-install-linux.sh
Executable file
7
resources/scripts/.travis-install-linux.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source /opt/qt57/bin/qt57-env.sh
|
||||||
|
mkdir rssguard-build && cd rssguard-build
|
||||||
|
qmake ..
|
||||||
|
make
|
||||||
|
make install
|
9
resources/scripts/.travis-install-osx.sh
Executable file
9
resources/scripts/.travis-install-osx.sh
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
mkdir rssguard-build && cd rssguard-build
|
||||||
|
qmake ..
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
macdeployqt rssguard.app -dmg
|
||||||
|
ls -lha
|
||||||
|
curl --upload-file ./*.dmg https://transfer.sh/rssguard.dmg
|
@ -8,7 +8,9 @@ Changed:
|
|||||||
▪ Big application core refactoring. Many functions rewritten, some bad code removed.
|
▪ Big application core refactoring. Many functions rewritten, some bad code removed.
|
||||||
|
|
||||||
Fixed:
|
Fixed:
|
||||||
|
▪ RSS Guard could not stop ongoing feed updates. (bug #52)
|
||||||
▪ RSS Guard was not launchable in Windows XP. (bug #53)
|
▪ RSS Guard was not launchable in Windows XP. (bug #53)
|
||||||
|
▪ RSS Guard crashed when switching msg status during feed updates. (bug #41)
|
||||||
|
|
||||||
3.3.3
|
3.3.3
|
||||||
—————
|
—————
|
||||||
|
@ -135,7 +135,7 @@ exists(.git) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isEmpty(APP_REVISION) {
|
isEmpty(APP_REVISION) {
|
||||||
APP_REVISION = "-"
|
APP_REVISION = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINES += APP_REVISION='"\\\"$$APP_REVISION\\\""'
|
DEFINES += APP_REVISION='"\\\"$$APP_REVISION\\\""'
|
||||||
@ -537,11 +537,11 @@ QMAKE_EXTRA_COMPILERS += lrelease
|
|||||||
win32 {
|
win32 {
|
||||||
seven_zip.target = 7zip
|
seven_zip.target = 7zip
|
||||||
seven_zip.depends = install
|
seven_zip.depends = install
|
||||||
seven_zip.commands = $$shell_path($$shell_quote($$PWD/resources/scripts/7za/7za.exe)) a -t7z $$TARGET-$$APP_VERSION-win32.7z $$shell_path($$PREFIX/*)
|
seven_zip.commands = $$shell_path($$shell_quote($$PWD/resources/scripts/7za/7za.exe)) a -t7z $$TARGET-$$APP_VERSION-$$APP_REVISION-win32.7z $$shell_path($$PREFIX/*)
|
||||||
|
|
||||||
zip.target = zip
|
zip.target = zip
|
||||||
zip.depends = install
|
zip.depends = install
|
||||||
zip.commands = $$shell_path($$shell_quote($$PWD/resources/scripts/7za/7za.exe)) a -tzip $$TARGET-$$APP_VERSION-win32.zip $$shell_path($$PREFIX/*)
|
zip.commands = $$shell_path($$shell_quote($$PWD/resources/scripts/7za/7za.exe)) a -tzip $$TARGET-$$APP_VERSION-$$APP_REVISION-win32.zip $$shell_path($$PREFIX/*)
|
||||||
|
|
||||||
QMAKE_EXTRA_TARGETS += seven_zip zip
|
QMAKE_EXTRA_TARGETS += seven_zip zip
|
||||||
}
|
}
|
||||||
@ -551,7 +551,7 @@ win32 {
|
|||||||
nsis.target = nsis
|
nsis.target = nsis
|
||||||
nsis.depends = install
|
nsis.depends = install
|
||||||
nsis.commands = \
|
nsis.commands = \
|
||||||
$$shell_path($$shell_quote($$PWD/resources/scripts/sed/sed.exe)) -e \"s|@APP_VERSION@|$$APP_VERSION|g; s|@APP_NAME@|$$APP_NAME|g; s|@APP_LOW_NAME@|$$APP_LOW_NAME|g; s|@EXE_NAME@|$${APP_LOW_NAME}.exe|g; s|@PWD@|$$replace(PWD, /, \\\\)|g; s|@OUT_PWD@|$$replace(OUT_PWD, /, \\\\)|g\" $$shell_path($$shell_quote($$PWD/resources/nsis/NSIS.definitions.nsh.in)) > $$shell_path($$shell_quote($$OUT_PWD/NSIS.definitions.nsh)) && \
|
$$shell_path($$shell_quote($$PWD/resources/scripts/sed/sed.exe)) -e \"s|@APP_VERSION@|$$APP_VERSION|g; s|@APP_REVISION@|$$APP_REVISION|g; s|@APP_NAME@|$$APP_NAME|g; s|@APP_LOW_NAME@|$$APP_LOW_NAME|g; s|@EXE_NAME@|$${APP_LOW_NAME}.exe|g; s|@PWD@|$$replace(PWD, /, \\\\)|g; s|@OUT_PWD@|$$replace(OUT_PWD, /, \\\\)|g\" $$shell_path($$shell_quote($$PWD/resources/nsis/NSIS.definitions.nsh.in)) > $$shell_path($$shell_quote($$OUT_PWD/NSIS.definitions.nsh)) && \
|
||||||
xcopy /Y $$shell_path($$shell_quote($$PWD/resources/nsis/NSIS.template.in)) $$shell_path($$shell_quote($$OUT_PWD/)) && \
|
xcopy /Y $$shell_path($$shell_quote($$PWD/resources/nsis/NSIS.template.in)) $$shell_path($$shell_quote($$OUT_PWD/)) && \
|
||||||
$$shell_path($$shell_quote($$PWD/resources/scripts/nsis/makensis.exe)) $$shell_path($$shell_quote($$OUT_PWD/NSIS.template.in))
|
$$shell_path($$shell_quote($$PWD/resources/scripts/nsis/makensis.exe)) $$shell_path($$shell_quote($$OUT_PWD/NSIS.template.in))
|
||||||
|
|
||||||
|
@ -23,99 +23,103 @@
|
|||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QThreadPool>
|
#include <QThreadPool>
|
||||||
|
#include <QMutexLocker>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
|
||||||
FeedDownloader::FeedDownloader(QObject *parent)
|
FeedDownloader::FeedDownloader(QObject *parent)
|
||||||
: QObject(parent), m_results(FeedDownloadResults()), m_feedsUpdated(0), m_feedsToUpdate(0),
|
: QObject(parent), m_feeds(QList<Feed*>()), m_mutex(new QMutex()), m_threadPool(new QThreadPool(this)),
|
||||||
m_feedsUpdating(0), m_feedsTotalCount(0), m_stopUpdate(false) {
|
m_results(FeedDownloadResults()), m_feedsUpdated(0),
|
||||||
|
m_feedsUpdating(0), m_feedsOriginalCount(0) {
|
||||||
qRegisterMetaType<FeedDownloadResults>("FeedDownloadResults");
|
qRegisterMetaType<FeedDownloadResults>("FeedDownloadResults");
|
||||||
|
m_threadPool->setMaxThreadCount(FEED_DOWNLOADER_MAX_THREADS);
|
||||||
}
|
}
|
||||||
|
|
||||||
FeedDownloader::~FeedDownloader() {
|
FeedDownloader::~FeedDownloader() {
|
||||||
|
m_mutex->tryLock();
|
||||||
|
m_mutex->unlock();
|
||||||
|
delete m_mutex;
|
||||||
|
|
||||||
qDebug("Destroying FeedDownloader instance.");
|
qDebug("Destroying FeedDownloader instance.");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FeedDownloader::isUpdateRunning() const {
|
bool FeedDownloader::isUpdateRunning() const {
|
||||||
return m_feedsToUpdate > 0 || m_feedsUpdating > 0;
|
return !m_feeds.isEmpty() || m_feedsUpdating > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FeedDownloader::updateAvailableFeeds() {
|
||||||
|
while (!m_feeds.isEmpty()) {
|
||||||
|
connect(m_feeds.first(), &Feed::messagesObtained, this, &FeedDownloader::oneFeedUpdateFinished,
|
||||||
|
(Qt::ConnectionType) (Qt::UniqueConnection | Qt::AutoConnection));
|
||||||
|
if (m_threadPool->tryStart(m_feeds.first())) {
|
||||||
|
m_feeds.removeFirst();
|
||||||
|
m_feedsUpdating++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// We want to start update of some feeds but all working threads are occupied.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedDownloader::updateFeeds(const QList<Feed*> &feeds) {
|
void FeedDownloader::updateFeeds(const QList<Feed*> &feeds) {
|
||||||
|
QMutexLocker locker(m_mutex);
|
||||||
|
|
||||||
if (feeds.isEmpty()) {
|
if (feeds.isEmpty()) {
|
||||||
qDebug("No feeds to update in worker thread, aborting update.");
|
qDebug("No feeds to update in worker thread, aborting update.");
|
||||||
finalizeUpdate();
|
finalizeUpdate();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
qDebug().nospace() << "Starting feed updates from worker in thread: \'" << QThread::currentThreadId() << "\'.";
|
||||||
|
|
||||||
qDebug().nospace() << "Starting feed updates from worker in thread: \'" << QThread::currentThreadId() << "\'.";
|
m_feeds = feeds;
|
||||||
|
m_feedsOriginalCount = m_feeds.size();
|
||||||
|
m_results.clear();
|
||||||
|
m_feedsUpdated = m_feedsUpdating = 0;
|
||||||
|
|
||||||
// It may be good to disable "stop" action when batch feed update
|
// Job starts now.
|
||||||
// starts.
|
emit updateStarted();
|
||||||
m_stopUpdate = false;
|
updateAvailableFeeds();
|
||||||
|
|
||||||
m_results.clear();
|
|
||||||
|
|
||||||
m_feedsUpdated = 0;
|
|
||||||
m_feedsUpdating = 0;
|
|
||||||
m_feedsToUpdate = feeds.size();
|
|
||||||
m_feedsTotalCount = m_feedsToUpdate;
|
|
||||||
|
|
||||||
// Job starts now.
|
|
||||||
emit updateStarted();
|
|
||||||
|
|
||||||
for (int i = 0; i < m_feedsTotalCount; i++) {
|
|
||||||
if (m_stopUpdate) {
|
|
||||||
qDebug("Stopping batch feed update now.");
|
|
||||||
|
|
||||||
// We want indicate that no more feeds will be updated in this queue.
|
|
||||||
m_feedsToUpdate = 0;
|
|
||||||
|
|
||||||
if (m_feedsUpdating <= 0) {
|
|
||||||
// User forced to stop, no more feeds will start updating.
|
|
||||||
// If also no feeds are updating right now, finish.
|
|
||||||
finalizeUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
connect(feeds.at(i), &Feed::messagesObtained, this, &FeedDownloader::oneFeedUpdateFinished,
|
|
||||||
(Qt::ConnectionType) (Qt::UniqueConnection | Qt::AutoConnection));
|
|
||||||
QThreadPool::globalInstance()->start(feeds.at(i));
|
|
||||||
|
|
||||||
m_feedsUpdating++;
|
|
||||||
m_feedsToUpdate--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedDownloader::stopRunningUpdate() {
|
void FeedDownloader::stopRunningUpdate() {
|
||||||
m_stopUpdate = true;
|
m_threadPool->clear();
|
||||||
|
m_feeds.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedDownloader::oneFeedUpdateFinished(const QList<Message> &messages) {
|
void FeedDownloader::oneFeedUpdateFinished(const QList<Message> &messages) {
|
||||||
|
QMutexLocker locker(m_mutex);
|
||||||
|
|
||||||
|
m_feedsUpdated++;
|
||||||
|
m_feedsUpdating--;
|
||||||
|
|
||||||
Feed *feed = qobject_cast<Feed*>(sender());
|
Feed *feed = qobject_cast<Feed*>(sender());
|
||||||
|
|
||||||
disconnect(feed, &Feed::messagesObtained, this, &FeedDownloader::oneFeedUpdateFinished);
|
disconnect(feed, &Feed::messagesObtained, this, &FeedDownloader::oneFeedUpdateFinished);
|
||||||
|
|
||||||
m_feedsUpdated++;
|
// Now, we check if there are any feeds we would like to update too.
|
||||||
m_feedsUpdating--;
|
updateAvailableFeeds();
|
||||||
|
|
||||||
// Now make sure, that messages are actually stored to SQL in a locked state.
|
// Now make sure, that messages are actually stored to SQL in a locked state.
|
||||||
qDebug().nospace() << "Saving messages of feed "
|
qDebug().nospace() << "Saving messages of feed "
|
||||||
<< feed->id() << " in thread: \'"
|
<< feed->id() << " in thread: \'"
|
||||||
<< QThread::currentThreadId() << "\'.";
|
<< QThread::currentThreadId() << "\'.";
|
||||||
|
|
||||||
if (!m_stopUpdate) {
|
int updated_messages;
|
||||||
int updated_messages = messages.isEmpty() ? 0 : feed->updateMessages(messages);
|
|
||||||
|
|
||||||
if (updated_messages > 0) {
|
QMetaObject::invokeMethod(feed, "updateMessages", Qt::BlockingQueuedConnection,
|
||||||
m_results.appendUpdatedFeed(QPair<QString,int>(feed->title(), updated_messages));
|
Q_RETURN_ARG(int, updated_messages),
|
||||||
}
|
Q_ARG(QList<Message>, messages));
|
||||||
|
|
||||||
|
if (updated_messages > 0) {
|
||||||
|
m_results.appendUpdatedFeed(QPair<QString,int>(feed->title(), updated_messages));
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("Made progress in feed updates, total feeds count %d/%d (id of feed is %d).", m_feedsUpdated, m_feedsTotalCount, feed->id());
|
qDebug("Made progress in feed updates, total feeds count %d/%d (id of feed is %d).", m_feedsUpdated, m_feedsOriginalCount, feed->id());
|
||||||
emit updateProgress(feed, m_feedsUpdated, m_feedsTotalCount);
|
emit updateProgress(feed, m_feedsUpdated, m_feedsOriginalCount);
|
||||||
|
|
||||||
if (m_feedsToUpdate <= 0 && m_feedsUpdating <= 0) {
|
if (m_feeds.isEmpty() && m_feedsUpdating <= 0) {
|
||||||
finalizeUpdate();
|
finalizeUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,9 +129,6 @@ void FeedDownloader::finalizeUpdate() {
|
|||||||
|
|
||||||
m_results.sort();
|
m_results.sort();
|
||||||
|
|
||||||
// Make sure that there is not "stop" action pending.
|
|
||||||
m_stopUpdate = false;
|
|
||||||
|
|
||||||
// Update of feeds has finished.
|
// Update of feeds has finished.
|
||||||
// NOTE: This means that now "update lock" can be unlocked
|
// NOTE: This means that now "update lock" can be unlocked
|
||||||
// and feeds can be added/edited/deleted and application
|
// and feeds can be added/edited/deleted and application
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
|
|
||||||
|
|
||||||
class Feed;
|
class Feed;
|
||||||
|
class QThreadPool;
|
||||||
|
class QMutex;
|
||||||
|
|
||||||
// Represents results of batch feed updates.
|
// Represents results of batch feed updates.
|
||||||
class FeedDownloadResults {
|
class FeedDownloadResults {
|
||||||
@ -86,16 +88,17 @@ class FeedDownloader : public QObject {
|
|||||||
void updateProgress(const Feed *feed, int current, int total);
|
void updateProgress(const Feed *feed, int current, int total);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void updateAvailableFeeds();
|
||||||
void finalizeUpdate();
|
void finalizeUpdate();
|
||||||
|
|
||||||
|
QList<Feed*> m_feeds;
|
||||||
|
QMutex *m_mutex;
|
||||||
|
QThreadPool *m_threadPool;
|
||||||
FeedDownloadResults m_results;
|
FeedDownloadResults m_results;
|
||||||
|
|
||||||
int m_feedsUpdated;
|
int m_feedsUpdated;
|
||||||
int m_feedsToUpdate;
|
|
||||||
int m_feedsUpdating;
|
int m_feedsUpdating;
|
||||||
int m_feedsTotalCount;
|
int m_feedsOriginalCount;
|
||||||
|
|
||||||
bool m_stopUpdate;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FEEDDOWNLOADER_H
|
#endif // FEEDDOWNLOADER_H
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#define DOWNLOAD_TIMEOUT 5000
|
#define DOWNLOAD_TIMEOUT 5000
|
||||||
#define MESSAGES_VIEW_DEFAULT_COL 170
|
#define MESSAGES_VIEW_DEFAULT_COL 170
|
||||||
#define FEEDS_VIEW_COLUMN_COUNT 2
|
#define FEEDS_VIEW_COLUMN_COUNT 2
|
||||||
|
#define FEED_DOWNLOADER_MAX_THREADS 6
|
||||||
#define DEFAULT_DAYS_TO_DELETE_MSG 14
|
#define DEFAULT_DAYS_TO_DELETE_MSG 14
|
||||||
#define ELLIPSIS_LENGTH 3
|
#define ELLIPSIS_LENGTH 3
|
||||||
#define MIN_CATEGORY_NAME_LENGTH 1
|
#define MIN_CATEGORY_NAME_LENGTH 1
|
||||||
|
@ -84,9 +84,7 @@ void FeedReader::updateFeeds(const QList<Feed*> &feeds) {
|
|||||||
qRegisterMetaType<QList<Feed*> >("QList<Feed*>");
|
qRegisterMetaType<QList<Feed*> >("QList<Feed*>");
|
||||||
m_feedDownloader->moveToThread(m_feedDownloaderThread);
|
m_feedDownloader->moveToThread(m_feedDownloaderThread);
|
||||||
|
|
||||||
connect(this, &FeedReader::feedsUpdateRequested, m_feedDownloader, &FeedDownloader::updateFeeds);
|
|
||||||
connect(m_feedDownloaderThread, &QThread::finished, m_feedDownloaderThread, &QThread::deleteLater);
|
connect(m_feedDownloaderThread, &QThread::finished, m_feedDownloaderThread, &QThread::deleteLater);
|
||||||
|
|
||||||
connect(m_feedDownloader, &FeedDownloader::updateFinished, this, &FeedReader::feedUpdatesFinished);
|
connect(m_feedDownloader, &FeedDownloader::updateFinished, this, &FeedReader::feedUpdatesFinished);
|
||||||
connect(m_feedDownloader, &FeedDownloader::updateProgress, this, &FeedReader::feedUpdatesProgress);
|
connect(m_feedDownloader, &FeedDownloader::updateProgress, this, &FeedReader::feedUpdatesProgress);
|
||||||
connect(m_feedDownloader, &FeedDownloader::updateStarted, this, &FeedReader::feedUpdatesStarted);
|
connect(m_feedDownloader, &FeedDownloader::updateStarted, this, &FeedReader::feedUpdatesStarted);
|
||||||
@ -96,7 +94,7 @@ void FeedReader::updateFeeds(const QList<Feed*> &feeds) {
|
|||||||
m_feedDownloaderThread->start();
|
m_feedDownloaderThread->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
emit feedsUpdateRequested(feeds);
|
QMetaObject::invokeMethod(m_feedDownloader, "updateFeeds", Q_ARG(QList<Feed*>, feeds));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedReader::updateAutoUpdateStatus() {
|
void FeedReader::updateAutoUpdateStatus() {
|
||||||
@ -126,7 +124,7 @@ void FeedReader::updateAllFeeds() {
|
|||||||
|
|
||||||
void FeedReader::stopRunningFeedUpdate() {
|
void FeedReader::stopRunningFeedUpdate() {
|
||||||
if (m_feedDownloader != nullptr) {
|
if (m_feedDownloader != nullptr) {
|
||||||
m_feedDownloader->stopRunningUpdate();
|
QMetaObject::invokeMethod(m_feedDownloader, "stopRunningUpdate");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,6 +207,12 @@ void FeedReader::stop() {
|
|||||||
if (m_feedDownloaderThread != nullptr && m_feedDownloaderThread->isRunning()) {
|
if (m_feedDownloaderThread != nullptr && m_feedDownloaderThread->isRunning()) {
|
||||||
m_feedDownloader->stopRunningUpdate();
|
m_feedDownloader->stopRunningUpdate();
|
||||||
|
|
||||||
|
if (m_feedDownloader->isUpdateRunning()) {
|
||||||
|
QEventLoop loop(this);
|
||||||
|
connect(m_feedDownloader, &FeedDownloader::updateFinished, &loop, &QEventLoop::quit);
|
||||||
|
loop.exec();
|
||||||
|
}
|
||||||
|
|
||||||
qDebug("Quitting feed downloader thread.");
|
qDebug("Quitting feed downloader thread.");
|
||||||
m_feedDownloaderThread->quit();
|
m_feedDownloaderThread->quit();
|
||||||
|
|
||||||
|
@ -72,9 +72,6 @@ class FeedReader : public QObject {
|
|||||||
void executeNextAutoUpdate();
|
void executeNextAutoUpdate();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
// Emitted when model requests update of some feeds.
|
|
||||||
void feedsUpdateRequested(QList<Feed*> feeds);
|
|
||||||
|
|
||||||
void feedUpdatesStarted();
|
void feedUpdatesStarted();
|
||||||
void feedUpdatesFinished(FeedDownloadResults updated_feeds);
|
void feedUpdatesFinished(FeedDownloadResults updated_feeds);
|
||||||
void feedUpdatesProgress(const Feed *feed, int current, int total);
|
void feedUpdatesProgress(const Feed *feed, int current, int total);
|
||||||
|
@ -144,11 +144,13 @@ void Feed::run() {
|
|||||||
<< QThread::currentThreadId() << "\'.";
|
<< QThread::currentThreadId() << "\'.";
|
||||||
|
|
||||||
QList<Message> msgs = obtainNewMessages();
|
QList<Message> msgs = obtainNewMessages();
|
||||||
|
|
||||||
emit messagesObtained(msgs);
|
emit messagesObtained(msgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Feed::updateMessages(const QList<Message> &messages) {
|
int Feed::updateMessages(const QList<Message> &messages) {
|
||||||
|
qDebug().nospace() << "Updating messages in DB. Main thread: " <<
|
||||||
|
(QThread::currentThread() == qApp->thread() ? "true." : "false.");
|
||||||
|
|
||||||
int custom_id = customId();
|
int custom_id = customId();
|
||||||
int account_id = getParentServiceRoot()->accountId();
|
int account_id = getParentServiceRoot()->accountId();
|
||||||
bool anything_updated = false;
|
bool anything_updated = false;
|
||||||
|
@ -78,12 +78,13 @@ class Feed : public RootItem, public QRunnable {
|
|||||||
QString url() const;
|
QString url() const;
|
||||||
void setUrl(const QString &url);
|
void setUrl(const QString &url);
|
||||||
|
|
||||||
int updateMessages(const QList<Message> &messages);
|
|
||||||
void updateCounts(bool including_total_count);
|
|
||||||
|
|
||||||
// Runs update in thread (thread pooled).
|
// Runs update in thread (thread pooled).
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void updateCounts(bool including_total_count);
|
||||||
|
int updateMessages(const QList<Message> &messages);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Performs synchronous obtaining of new messages for this feed.
|
// Performs synchronous obtaining of new messages for this feed.
|
||||||
virtual QList<Message> obtainNewMessages() = 0;
|
virtual QList<Message> obtainNewMessages() = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user