Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • akiraohgaki/ocs-manager
  • dfn2/ocs-manager
  • azubieta/ocs-manager
  • rws77/ocs-manager
4 results
Show changes
Commits on Source (160)
Showing
with 424 additions and 269 deletions
*.pro.user *.pro.user
build_*/ build_*/
lib/qtlib/ lib/qtil/
lib/AppImageUpdate/ lib/AppImageUpdate/
lib/AppImageUpdate-prebuilt/ lib/AppImageUpdate-prebuilt/
stages:
- build
appimage:
stage: build
image: ubuntu:14.04
only:
- master
- /^release\-.+/
script:
- ./scripts/package appimage
artifacts:
paths:
- build_*/ocs-manager*.AppImage
expire_in: 2 days
dist: trusty
sudo: required
services:
- docker
branches:
only:
- master
script:
- mntdir='/mnt/ocs-manager'
#- docker run --rm -v $(pwd):${mntdir} ubuntu:16.04 /bin/bash -c "sh ${mntdir}/scripts/build-docker.sh snap"
#- docker run --rm -v $(pwd):${mntdir} ubuntu:16.04 /bin/bash -c "sh ${mntdir}/scripts/build-docker.sh flatpak"
- docker run --rm -v $(pwd):${mntdir} ubuntu:17.10 /bin/bash -c "sh ${mntdir}/scripts/build-docker.sh appimage"
- cat transfer.log
# ocs-manager # ocs-manager
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
[![Build Status](https://travis-ci.org/opendesktop/ocs-manager.svg?branch=master)](https://travis-ci.org/opendesktop/ocs-manager)
A tool to handle item installation from OCS provider, file management, and apply themes. A tool to handle item installation from OCS provider, file management, and apply themes.
Copyright: 2017, Opendesktop.org Copyright: 2017-2019, Opendesktop.org
License: GPL-3+ License: GPL-3+
...@@ -29,7 +29,7 @@ RESOURCES += $${PWD}/configs/configs.qrc ...@@ -29,7 +29,7 @@ RESOURCES += $${PWD}/configs/configs.qrc
INCLUDEPATH += $${PWD}/src INCLUDEPATH += $${PWD}/src
unix:!ios:!android { contains(DEFINES, APP_DESKTOP) {
QT += dbus QT += dbus
HEADERS += \ HEADERS += \
......
{ {
"id": "ocs-manager", "id": "ocs-manager",
"name": "ocs-manager", "name": "ocs-manager",
"version": "0.5.0", "version": "0.8.1",
"organization": "Opendesktop.org", "organization": "Opendesktop.org",
"domain": "org.opendesktop.ocs-manager", "domain": "org.opendesktop.ocs-manager",
"icon": ":/desktop/ocs-manager.svg", "icon": ":/desktop/ocs-manager.svg",
...@@ -9,5 +9,5 @@ ...@@ -9,5 +9,5 @@
"license": "GPL-3+", "license": "GPL-3+",
"author": "Opendesktop.org", "author": "Opendesktop.org",
"contact": "contact@opendesktop.org", "contact": "contact@opendesktop.org",
"homepage": "https://github.com/opendesktop/ocs-manager" "homepage": "https://git.opendesktop.org/akiraohgaki/ocs-manager"
} }
{ {
"bin": { "bin": {
"name": "Softwares", "name": "Software",
"destination": "$HOME/.local/bin", "destination": "",
"xdg_destination": "$HOME/.local/bin",
"generic_destination": "$APP_DATA/bin" "generic_destination": "$APP_DATA/bin"
}, },
"downloads": { "downloads": {
"name": "Downloads", "name": "Downloads",
"destination": "$XDG_DOWNLOAD_DIR", "destination": "",
"xdg_destination": "$XDG_DOWNLOAD_DIR",
"generic_destination": "$APP_DATA/downloads" "generic_destination": "$APP_DATA/downloads"
}, },
"documents": { "documents": {
"name": "Documents", "name": "Documents",
"destination": "$XDG_DOCUMENTS_DIR", "destination": "",
"xdg_destination": "$XDG_DOCUMENTS_DIR",
"generic_destination": "$APP_DATA/documents" "generic_destination": "$APP_DATA/documents"
}, },
"pictures": { "pictures": {
"name": "Pictures", "name": "Pictures",
"destination": "$XDG_PICTURES_DIR", "destination": "",
"xdg_destination": "$XDG_PICTURES_DIR",
"generic_destination": "$APP_DATA/pictures" "generic_destination": "$APP_DATA/pictures"
}, },
"music": { "music": {
"name": "Music", "name": "Music",
"destination": "$XDG_MUSIC_DIR", "destination": "",
"xdg_destination": "$XDG_MUSIC_DIR",
"generic_destination": "$APP_DATA/music" "generic_destination": "$APP_DATA/music"
}, },
"videos": { "videos": {
"name": "Videos", "name": "Videos",
"destination": "$XDG_VIDEOS_DIR", "destination": "",
"xdg_destination": "$XDG_VIDEOS_DIR",
"generic_destination": "$APP_DATA/videos" "generic_destination": "$APP_DATA/videos"
}, },
"wallpapers": { "wallpapers": {
"name": "Wallpapers", "name": "Wallpapers",
"destination": "$XDG_DATA_HOME/wallpapers", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/wallpapers",
"generic_destination": "$APP_DATA/wallpapers" "generic_destination": "$APP_DATA/wallpapers"
}, },
"fonts": { "fonts": {
"name": "Fonts", "name": "Fonts",
"destination": "$HOME/.fonts", "destination": "",
"xdg_destination": "$HOME/.fonts",
"generic_destination": "$APP_DATA/fonts" "generic_destination": "$APP_DATA/fonts"
}, },
"cursors": { "cursors": {
"name": "Cursors", "name": "Cursors",
"destination": "$HOME/.icons", "destination": "",
"xdg_destination": "$HOME/.icons",
"generic_destination": "$APP_DATA/cursors" "generic_destination": "$APP_DATA/cursors"
}, },
"icons": { "icons": {
"name": "Icons", "name": "Icons",
"destination": "$XDG_DATA_HOME/icons", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/icons",
"generic_destination": "$APP_DATA/icons" "generic_destination": "$APP_DATA/icons"
}, },
"emoticons": { "emoticons": {
"name": "Emoticons", "name": "Emoticons",
"destination": "$XDG_DATA_HOME/emoticons", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/emoticons",
"generic_destination": "$APP_DATA/emoticons" "generic_destination": "$APP_DATA/emoticons"
}, },
"themes": { "themes": {
"name": "Desktop Themes", "name": "Desktop Themes",
"destination": "$HOME/.themes", "destination": "",
"xdg_destination": "$HOME/.themes",
"generic_destination": "$APP_DATA/themes" "generic_destination": "$APP_DATA/themes"
}, },
"emerald_themes": { "emerald_themes": {
"name": "Emerald Themes", "name": "Emerald Themes",
"destination": "$HOME/.emerald/themes", "destination": "",
"xdg_destination": "$HOME/.emerald/themes",
"generic_destination": "$APP_DATA/emerald_themes" "generic_destination": "$APP_DATA/emerald_themes"
}, },
"enlightenment_themes": { "enlightenment_themes": {
"name": "Enlightenment Themes", "name": "Enlightenment Themes",
"destination": "$HOME/.e/e/themes", "destination": "",
"xdg_destination": "$HOME/.e/e/themes",
"generic_destination": "$APP_DATA/enlightenment_themes" "generic_destination": "$APP_DATA/enlightenment_themes"
}, },
"enlightenment_backgrounds": { "enlightenment_backgrounds": {
"name": "Enlightenment Backgrounds", "name": "Enlightenment Backgrounds",
"destination": "$HOME/.e/e/backgrounds", "destination": "",
"xdg_destination": "$HOME/.e/e/backgrounds",
"generic_destination": "$APP_DATA/enlightenment_backgrounds" "generic_destination": "$APP_DATA/enlightenment_backgrounds"
}, },
"fluxbox_styles": { "fluxbox_styles": {
"name": "Fluxbox Styles", "name": "Fluxbox Styles",
"destination": "$HOME/.fluxbox/styles", "destination": "",
"xdg_destination": "$HOME/.fluxbox/styles",
"generic_destination": "$APP_DATA/fluxbox_styles" "generic_destination": "$APP_DATA/fluxbox_styles"
}, },
"pekwm_themes": { "pekwm_themes": {
"name": "PekWM Themes", "name": "PekWM Themes",
"destination": "$HOME/.pekwm/themes", "destination": "",
"xdg_destination": "$HOME/.pekwm/themes",
"generic_destination": "$APP_DATA/pekwm_themes" "generic_destination": "$APP_DATA/pekwm_themes"
}, },
"icewm_themes": { "icewm_themes": {
"name": "IceWM Themes", "name": "IceWM Themes",
"destination": "$HOME/.icewm/themes", "destination": "",
"xdg_destination": "$HOME/.icewm/themes",
"generic_destination": "$APP_DATA/icewm_themes" "generic_destination": "$APP_DATA/icewm_themes"
}, },
"plasma_plasmoids": { "plasma_plasmoids": {
"name": "Plasma Plasmoids", "name": "Plasma Plasmoids",
"destination": "$XDG_DATA_HOME/plasma/plasmoids", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/plasma/plasmoids",
"generic_destination": "$APP_DATA/plasma_plasmoids" "generic_destination": "$APP_DATA/plasma_plasmoids"
}, },
"plasma_look_and_feel": { "plasma_look_and_feel": {
"name": "Plasma Look and Feel", "name": "Plasma Look and Feel",
"destination": "$XDG_DATA_HOME/plasma/look-and-feel", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/plasma/look-and-feel",
"generic_destination": "$APP_DATA/plasma_look_and_feel" "generic_destination": "$APP_DATA/plasma_look_and_feel"
}, },
"plasma_desktopthemes": { "plasma_desktopthemes": {
"name": "Plasma Desktop Themes", "name": "Plasma Desktop Themes",
"destination": "$XDG_DATA_HOME/plasma/desktoptheme", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/plasma/desktoptheme",
"generic_destination": "$APP_DATA/plasma_desktopthemes" "generic_destination": "$APP_DATA/plasma_desktopthemes"
}, },
"kwin_effects": { "kwin_effects": {
"name": "KWin Effects", "name": "KWin Effects",
"destination": "$XDG_DATA_HOME/kwin/effects", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/kwin/effects",
"generic_destination": "$APP_DATA/kwin_effects" "generic_destination": "$APP_DATA/kwin_effects"
}, },
"kwin_scripts": { "kwin_scripts": {
"name": "KWin Scripts", "name": "KWin Scripts",
"destination": "$XDG_DATA_HOME/kwin/scripts", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/kwin/scripts",
"generic_destination": "$APP_DATA/kwin_scripts" "generic_destination": "$APP_DATA/kwin_scripts"
}, },
"kwin_tabbox": { "kwin_tabbox": {
"name": "KWin Window Switcher", "name": "KWin Window Switcher",
"destination": "$XDG_DATA_HOME/kwin/tabbox", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/kwin/tabbox",
"generic_destination": "$APP_DATA/kwin_tabbox" "generic_destination": "$APP_DATA/kwin_tabbox"
}, },
"aurorae_themes": { "aurorae_themes": {
"name": "Aurorae Themes", "name": "Aurorae Themes",
"destination": "$XDG_DATA_HOME/aurorae/themes", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/aurorae/themes",
"generic_destination": "$APP_DATA/aurorae_themes" "generic_destination": "$APP_DATA/aurorae_themes"
}, },
"dekorator_themes": { "dekorator_themes": {
"name": "deKorator Themes", "name": "deKorator Themes",
"destination": "$XDG_DATA_HOME/deKorator/themes", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/deKorator/themes",
"generic_destination": "$APP_DATA/dekorator_themes" "generic_destination": "$APP_DATA/dekorator_themes"
}, },
"qtcurve": { "qtcurve": {
"name": "QtCurve Themes", "name": "QtCurve Themes",
"destination": "$XDG_DATA_HOME/QtCurve", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/QtCurve",
"generic_destination": "$APP_DATA/qtcurve" "generic_destination": "$APP_DATA/qtcurve"
}, },
"color_schemes": { "color_schemes": {
"name": "KDE Color Schemes", "name": "KDE Color Schemes",
"destination": "$XDG_DATA_HOME/color-schemes", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/color-schemes",
"generic_destination": "$APP_DATA/color_schemes" "generic_destination": "$APP_DATA/color_schemes"
}, },
"gnome_shell_extensions": { "gnome_shell_extensions": {
"name": "Gnome Shell Extensions", "name": "Gnome Shell Extensions",
"destination": "$XDG_DATA_HOME/gnome-shell/extensions", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/gnome-shell/extensions",
"generic_destination": "$APP_DATA/gnome_shell_extensions" "generic_destination": "$APP_DATA/gnome_shell_extensions"
}, },
"cinnamon_applets": { "cinnamon_applets": {
"name": "Cinnamon Applets", "name": "Cinnamon Applets",
"destination": "$XDG_DATA_HOME/cinnamon/applets", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/cinnamon/applets",
"generic_destination": "$APP_DATA/cinnamon_applets" "generic_destination": "$APP_DATA/cinnamon_applets"
}, },
"cinnamon_desklets": { "cinnamon_desklets": {
"name": "Cinnamon Desklets", "name": "Cinnamon Desklets",
"destination": "$XDG_DATA_HOME/cinnamon/desklets", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/cinnamon/desklets",
"generic_destination": "$APP_DATA/cinnamon_desklets" "generic_destination": "$APP_DATA/cinnamon_desklets"
}, },
"cinnamon_extensions": { "cinnamon_extensions": {
"name": "Cinnamon Extensions", "name": "Cinnamon Extensions",
"destination": "$XDG_DATA_HOME/cinnamon/extensions", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/cinnamon/extensions",
"generic_destination": "$APP_DATA/cinnamon_extensions" "generic_destination": "$APP_DATA/cinnamon_extensions"
}, },
"nautilus_scripts": { "nautilus_scripts": {
"name": "Nautilus Scripts", "name": "Nautilus Scripts",
"destination": "$XDG_DATA_HOME/nautilus/scripts", "destination": "",
"xdg_destination": "$XDG_DATA_HOME/nautilus/scripts",
"generic_destination": "$APP_DATA/nautilus_scripts" "generic_destination": "$APP_DATA/nautilus_scripts"
}, },
"amarok_scripts": { "amarok_scripts": {
"name": "Amarok Scripts", "name": "Amarok Scripts",
"destination": "$KDEHOME/share/apps/amarok/scripts", "destination": "",
"xdg_destination": "$KDEHOME/share/apps/amarok/scripts",
"generic_destination": "$APP_DATA/amarok_scripts" "generic_destination": "$APP_DATA/amarok_scripts"
}, },
"yakuake_skins": { "yakuake_skins": {
"name": "Yakuake Skins", "name": "Yakuake Skins",
"destination": "$KDEHOME/share/apps/yakuake/skins", "destination": "",
"xdg_destination": "$KDEHOME/share/apps/yakuake/skins",
"generic_destination": "$APP_DATA/yakuake_skins" "generic_destination": "$APP_DATA/yakuake_skins"
}, },
"cairo_clock_themes": { "cairo_clock_themes": {
"name": "Cairo-Clock Themes", "name": "Cairo-Clock Themes",
"destination": "$HOME/.cairo-clock/themes", "destination": "",
"xdg_destination": "$HOME/.cairo-clock/themes",
"generic_destination": "$APP_DATA/cairo_clock_themes" "generic_destination": "$APP_DATA/cairo_clock_themes"
}, },
"books": { "books": {
"name": "Books", "name": "Books",
"destination": "$APP_DATA/books", "destination": "",
"xdg_destination": "$APP_DATA/books",
"generic_destination": "$APP_DATA/books" "generic_destination": "$APP_DATA/books"
}, },
"comics": { "comics": {
"name": "Comics", "name": "Comics",
"destination": "$APP_DATA/comics", "destination": "",
"xdg_destination": "$APP_DATA/comics",
"generic_destination": "$APP_DATA/comics" "generic_destination": "$APP_DATA/comics"
} }
} }
...@@ -59,6 +59,8 @@ bool KdeTheme::applyAsCursor() const ...@@ -59,6 +59,8 @@ bool KdeTheme::applyAsCursor() const
<< "c.writeEntry('cursorTheme', '" + themeName_ + "');"; << "c.writeEntry('cursorTheme', '" + themeName_ + "');";
if (evaluateScript(script)) { if (evaluateScript(script)) {
QProcess::startDetached("sh -c \"echo 'Xcursor.theme: " + themeName_ + "' | xrdb -merge\"");
auto setLaunchEnv = QDBusMessage::createMethodCall("org.kde.klauncher5", "/KLauncher", "org.kde.KLauncher", "setLaunchEnv"); auto setLaunchEnv = QDBusMessage::createMethodCall("org.kde.klauncher5", "/KLauncher", "org.kde.KLauncher", "setLaunchEnv");
setLaunchEnv.setArguments(QVariantList() << QVariant(QString("XCURSOR_THEME")) << QVariant(themeName_)); setLaunchEnv.setArguments(QVariantList() << QVariant(QString("XCURSOR_THEME")) << QVariant(themeName_));
QDBusConnection::sessionBus().call(setLaunchEnv); QDBusConnection::sessionBus().call(setLaunchEnv);
...@@ -67,6 +69,10 @@ bool KdeTheme::applyAsCursor() const ...@@ -67,6 +69,10 @@ bool KdeTheme::applyAsCursor() const
notifyChange.setArguments(QVariantList() << QVariant(qint32(5)) << QVariant(qint32(0))); notifyChange.setArguments(QVariantList() << QVariant(qint32(5)) << QVariant(qint32(0)));
QDBusConnection::sessionBus().send(notifyChange); QDBusConnection::sessionBus().send(notifyChange);
QProcess::startDetached("kwin --replace");
QProcess::startDetached("kquitapp5 plasmashell");
QProcess::startDetached("sh -c \"XCURSOR_THEME='" + themeName_ + "' kstart5 plasmashell\"");
return true; return true;
} }
return false; return false;
......
...@@ -3,15 +3,15 @@ ...@@ -3,15 +3,15 @@
#include <QStringList> #include <QStringList>
#include <QStandardPaths> #include <QStandardPaths>
#include "qtlib_dir.h" #include "qtil_dir.h"
ConfigHandler::ConfigHandler(QObject *parent) ConfigHandler::ConfigHandler(QObject *parent)
: QObject(parent) : QObject(parent)
{ {
appConfig_ = qtlib::Config(":/configs"); appConfig_ = Qtil::Config(":/configs");
importAppConfigApplication(); importAppConfigApplication();
importAppConfigInstallTypes(); importAppConfigInstallTypes();
usrConfig_ = qtlib::Config(qtlib::Dir::genericConfigPath() + "/" + getAppConfigApplication()["id"].toString()); usrConfig_ = Qtil::Config(Qtil::Dir::genericConfigPath() + "/" + getAppConfigApplication()["id"].toString());
} }
QJsonObject ConfigHandler::getAppConfigApplication() const QJsonObject ConfigHandler::getAppConfigApplication() const
...@@ -207,8 +207,15 @@ void ConfigHandler::importAppConfigInstallTypes() ...@@ -207,8 +207,15 @@ void ConfigHandler::importAppConfigInstallTypes()
auto installTypes = appConfig_.get("install_types"); auto installTypes = appConfig_.get("install_types");
for (const auto &key : installTypes.keys()) { for (const auto &key : installTypes.keys()) {
auto installtype = installTypes[key].toObject(); auto installtype = installTypes[key].toObject();
installtype["destination"] = convertPathString(installtype["destination"].toString()); auto xdgDestination = convertPathString(installtype["xdg_destination"].toString());
installtype["generic_destination"] = convertPathString(installtype["generic_destination"].toString()); auto genericDestination = convertPathString(installtype["generic_destination"].toString());
installtype["xdg_destination"] = xdgDestination;
installtype["generic_destination"] = genericDestination;
#ifdef APP_DESKTOP
installtype["destination"] = xdgDestination;
#else
installtype["destination"] = genericDestination;
#endif
installTypes[key] = installtype; installTypes[key] = installtype;
} }
auto installTypesAlias = appConfig_.get("install_types_alias"); auto installTypesAlias = appConfig_.get("install_types_alias");
...@@ -229,7 +236,7 @@ QString ConfigHandler::convertPathString(const QString &path) const ...@@ -229,7 +236,7 @@ QString ConfigHandler::convertPathString(const QString &path) const
{ {
auto newPath = path; auto newPath = path;
if (newPath.contains("$HOME")) { if (newPath.contains("$HOME")) {
newPath.replace("$HOME", qtlib::Dir::homePath()); newPath.replace("$HOME", Qtil::Dir::homePath());
} }
else if (newPath.contains("$XDG_DOCUMENTS_DIR")) { else if (newPath.contains("$XDG_DOCUMENTS_DIR")) {
newPath.replace("$XDG_DOCUMENTS_DIR", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); newPath.replace("$XDG_DOCUMENTS_DIR", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
...@@ -247,13 +254,13 @@ QString ConfigHandler::convertPathString(const QString &path) const ...@@ -247,13 +254,13 @@ QString ConfigHandler::convertPathString(const QString &path) const
newPath.replace("$XDG_VIDEOS_DIR", QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)); newPath.replace("$XDG_VIDEOS_DIR", QStandardPaths::writableLocation(QStandardPaths::MoviesLocation));
} }
else if (newPath.contains("$XDG_DATA_HOME")) { else if (newPath.contains("$XDG_DATA_HOME")) {
newPath.replace("$XDG_DATA_HOME", qtlib::Dir::genericDataPath()); newPath.replace("$XDG_DATA_HOME", Qtil::Dir::genericDataPath());
} }
else if (newPath.contains("$KDEHOME")) { else if (newPath.contains("$KDEHOME")) {
newPath.replace("$KDEHOME", qtlib::Dir::kdehomePath()); newPath.replace("$KDEHOME", Qtil::Dir::kdehomePath());
} }
else if (newPath.contains("$APP_DATA")) { else if (newPath.contains("$APP_DATA")) {
newPath.replace("$APP_DATA", qtlib::Dir::genericDataPath() + "/" + getAppConfigApplication()["id"].toString()); newPath.replace("$APP_DATA", Qtil::Dir::genericDataPath() + "/" + getAppConfigApplication()["id"].toString());
} }
return newPath; return newPath;
} }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <QObject> #include <QObject>
#include <QJsonObject> #include <QJsonObject>
#include "qtlib_config.h" #include "qtil_config.h"
class ConfigHandler : public QObject class ConfigHandler : public QObject
{ {
...@@ -42,8 +42,8 @@ private: ...@@ -42,8 +42,8 @@ private:
void importAppConfigInstallTypes(); void importAppConfigInstallTypes();
QString convertPathString(const QString &path) const; QString convertPathString(const QString &path) const;
qtlib::Config appConfig_; Qtil::Config appConfig_;
qtlib::Config usrConfig_; Qtil::Config usrConfig_;
QJsonObject appConfigApplication_; QJsonObject appConfigApplication_;
QJsonObject appConfigInstallTypes_; QJsonObject appConfigInstallTypes_;
}; };
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#include <QStringList> #include <QStringList>
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
#include <QFileInfo> #include <QFileInfo>
#include "desktopthemes/kdetheme.h" #include "desktopthemes/kdetheme.h"
...@@ -98,7 +98,7 @@ bool DesktopThemeHandler::isApplicableType(const QString &installType) const ...@@ -98,7 +98,7 @@ bool DesktopThemeHandler::isApplicableType(const QString &installType) const
bool DesktopThemeHandler::applyTheme(const QString &path, const QString &installType) const bool DesktopThemeHandler::applyTheme(const QString &path, const QString &installType) const
{ {
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
if (QFileInfo::exists(path) && isApplicableType(installType)) { if (QFileInfo::exists(path) && isApplicableType(installType)) {
auto desktop = desktopEnvironment(); auto desktop = desktopEnvironment();
......
...@@ -6,14 +6,16 @@ ...@@ -6,14 +6,16 @@
#include <QFileInfo> #include <QFileInfo>
#include <QDateTime> #include <QDateTime>
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
#include <QProcess> #include <QStringList>
#include <QDir>
#include <QDirIterator>
#endif #endif
#include "qtlib_dir.h" #include "qtil_dir.h"
#include "qtlib_file.h" #include "qtil_file.h"
#include "qtlib_networkresource.h" #include "qtil_networkresource.h"
#include "qtlib_package.h" #include "qtil_package.h"
#include "handlers/confighandler.h" #include "handlers/confighandler.h"
...@@ -67,9 +69,9 @@ void ItemHandler::getItem(const QString &command, const QString &url, const QStr ...@@ -67,9 +69,9 @@ void ItemHandler::getItem(const QString &command, const QString &url, const QStr
itemMetadataSet[itemKey] = metadata; itemMetadataSet[itemKey] = metadata;
setMetadataSet(itemMetadataSet); setMetadataSet(itemMetadataSet);
auto *resource = new qtlib::NetworkResource(itemKey, QUrl(url), true, this); auto *resource = new Qtil::NetworkResource(itemKey, QUrl(url), true, this);
connect(resource, &qtlib::NetworkResource::downloadProgress, this, &ItemHandler::downloadProgress); connect(resource, &Qtil::NetworkResource::downloadProgress, this, &ItemHandler::downloadProgress);
connect(resource, &qtlib::NetworkResource::finished, this, &ItemHandler::networkResourceFinished); connect(resource, &Qtil::NetworkResource::finished, this, &ItemHandler::networkResourceFinished);
resource->get(); resource->get();
result["status"] = QString("success_downloadstart"); result["status"] = QString("success_downloadstart");
...@@ -112,8 +114,7 @@ void ItemHandler::getItemByOcsUrl(const QString &ocsUrl, const QString &provider ...@@ -112,8 +114,7 @@ void ItemHandler::getItemByOcsUrl(const QString &ocsUrl, const QString &provider
filename = QUrl(url).fileName(); filename = QUrl(url).fileName();
} }
// Still support xdg and xdgs schemes for backward compatibility if ((scheme == "ocs" || scheme == "ocss")
if ((scheme == "ocs" || scheme == "ocss" || scheme == "xdg" || scheme == "xdgs")
&& (command == "download" || command == "install") && (command == "download" || command == "install")
&& QUrl(url).isValid() && QUrl(url).isValid()
&& configHandler_->getAppConfigInstallTypes().contains(type) && configHandler_->getAppConfigInstallTypes().contains(type)
...@@ -146,26 +147,18 @@ void ItemHandler::uninstall(const QString &itemKey) ...@@ -146,26 +147,18 @@ void ItemHandler::uninstall(const QString &itemKey)
auto installedItem = configHandler_->getUsrConfigInstalledItems()[itemKey].toObject(); auto installedItem = configHandler_->getUsrConfigInstalledItems()[itemKey].toObject();
auto installType = installedItem["install_type"].toString(); auto installType = installedItem["install_type"].toString();
qtlib::Dir destDir; Qtil::Dir destDir(configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString());
#ifdef QTLIB_UNIX
destDir.setPath(configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString());
for (const auto &filename : installedItem["files"].toArray()) { #ifdef APP_DESKTOP
for (const auto filename : installedItem["files"].toArray()) {
QFileInfo fileInfo(destDir.path() + "/" + filename.toString()); QFileInfo fileInfo(destDir.path() + "/" + filename.toString());
// plasmapkg: Installation process has should be saved plasmapkg into destination directory // plasmapkg: Installation process will saved plasmapkg into destination directory
qtlib::Package package(fileInfo.filePath()); Qtil::Package package(fileInfo.filePath());
// Uninstall // Uninstall
if (installType == "bin") { if (installType == "plasma_plasmoids" || installType == "plasma4_plasmoids" || installType == "plasma5_plasmoids") {
if (fileInfo.filePath().endsWith(".appimage", Qt::CaseInsensitive)) {
QProcess process;
process.start(fileInfo.filePath() + " --remove-appimage-desktop-integration");
process.waitForFinished();
}
}
else if (installType == "plasma_plasmoids" || installType == "plasma4_plasmoids" || installType == "plasma5_plasmoids") {
package.uninstallAsPlasmapkg("plasmoid"); package.uninstallAsPlasmapkg("plasmoid");
} }
else if (installType == "plasma_look_and_feel" || installType == "plasma5_look_and_feel") { else if (installType == "plasma_look_and_feel" || installType == "plasma5_look_and_feel") {
...@@ -186,22 +179,20 @@ void ItemHandler::uninstall(const QString &itemKey) ...@@ -186,22 +179,20 @@ void ItemHandler::uninstall(const QString &itemKey)
// Remove file // Remove file
if (fileInfo.isDir()) { if (fileInfo.isDir()) {
qtlib::Dir(fileInfo.filePath()).remove(); Qtil::Dir(fileInfo.filePath()).remove();
} }
else { else {
qtlib::File(fileInfo.filePath()).remove(); Qtil::File(fileInfo.filePath()).remove();
} }
} }
#else #else
destDir.setPath(configHandler_->getAppConfigInstallTypes()[installType].toObject()["generic_destination"].toString()); for (const auto filename : installedItem["files"].toArray()) {
for (const auto &filename : installedItem["files"].toArray()) {
QFileInfo fileInfo(destDir.path() + "/" + filename.toString()); QFileInfo fileInfo(destDir.path() + "/" + filename.toString());
if (fileInfo.isDir()) { if (fileInfo.isDir()) {
qtlib::Dir(fileInfo.filePath()).remove(); Qtil::Dir(fileInfo.filePath()).remove();
} }
else { else {
qtlib::File(fileInfo.filePath()).remove(); Qtil::File(fileInfo.filePath()).remove();
} }
} }
#endif #endif
...@@ -214,7 +205,7 @@ void ItemHandler::uninstall(const QString &itemKey) ...@@ -214,7 +205,7 @@ void ItemHandler::uninstall(const QString &itemKey)
emit uninstallFinished(result); emit uninstallFinished(result);
} }
void ItemHandler::networkResourceFinished(qtlib::NetworkResource *resource) void ItemHandler::networkResourceFinished(Qtil::NetworkResource *resource)
{ {
auto itemKey = resource->id(); auto itemKey = resource->id();
...@@ -252,7 +243,7 @@ void ItemHandler::setMetadataSet(const QJsonObject &metadataSet) ...@@ -252,7 +243,7 @@ void ItemHandler::setMetadataSet(const QJsonObject &metadataSet)
emit metadataSetChanged(); emit metadataSetChanged();
} }
void ItemHandler::saveDownloadedFile(qtlib::NetworkResource *resource) void ItemHandler::saveDownloadedFile(Qtil::NetworkResource *resource)
{ {
auto itemKey = resource->id(); auto itemKey = resource->id();
...@@ -271,9 +262,9 @@ void ItemHandler::saveDownloadedFile(qtlib::NetworkResource *resource) ...@@ -271,9 +262,9 @@ void ItemHandler::saveDownloadedFile(qtlib::NetworkResource *resource)
auto filename = metadata["filename"].toString(); auto filename = metadata["filename"].toString();
auto installType = metadata["install_type"].toString(); auto installType = metadata["install_type"].toString();
qtlib::Dir destDir(configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString()); Qtil::Dir destDir(configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString());
destDir.make(); destDir.make();
qtlib::File destFile(destDir.path() + "/" + filename); Qtil::File destFile(destDir.path() + "/" + filename);
if (destFile.exists()) { if (destFile.exists()) {
auto filenamePrefix = QString::number(QDateTime::currentMSecsSinceEpoch()) + "_"; auto filenamePrefix = QString::number(QDateTime::currentMSecsSinceEpoch()) + "_";
...@@ -295,7 +286,7 @@ void ItemHandler::saveDownloadedFile(qtlib::NetworkResource *resource) ...@@ -295,7 +286,7 @@ void ItemHandler::saveDownloadedFile(qtlib::NetworkResource *resource)
resource->deleteLater(); resource->deleteLater();
} }
void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource) void ItemHandler::installDownloadedFile(Qtil::NetworkResource *resource)
{ {
// Installation pre-process // Installation pre-process
auto itemKey = resource->id(); auto itemKey = resource->id();
...@@ -316,13 +307,15 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource) ...@@ -316,13 +307,15 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource)
auto installType = metadata["install_type"].toString(); auto installType = metadata["install_type"].toString();
QString tempDirPrefix = "temp_" + filename; QString tempDirPrefix = "temp_" + filename;
qtlib::Dir tempDir(qtlib::Dir::genericCachePath() + "/" Qtil::Dir tempDir(Qtil::Dir::genericCachePath() + "/"
+ configHandler_->getAppConfigApplication()["id"].toString() + "/" + configHandler_->getAppConfigApplication()["id"].toString() + "/"
+ tempDirPrefix); + tempDirPrefix);
tempDir.make(); tempDir.make();
qtlib::Dir tempDestDir(tempDir.path() + "/dest"); Qtil::Dir tempDestDir(tempDir.path() + "/dest");
tempDestDir.make(); tempDestDir.make();
qtlib::Package package(tempDir.path() + "/" + filename); Qtil::Dir tempSrcDir(tempDir.path() + "/src");
tempSrcDir.make();
Qtil::Package package(tempDir.path() + "/" + filename);
if (!resource->saveData(package.path())) { if (!resource->saveData(package.path())) {
result["status"] = QString("error_save"); result["status"] = QString("error_save");
...@@ -342,11 +335,10 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource) ...@@ -342,11 +335,10 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource)
result["message"] = tr("Installing"); result["message"] = tr("Installing");
emit installStarted(result); emit installStarted(result);
qtlib::Dir destDir; Qtil::Dir destDir(configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString());
#ifdef QTLIB_UNIX
destDir.setPath(configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString());
// plasmapkg: Need to save package to remove installed files later #ifdef APP_DESKTOP
// plasmapkg: Should save a package to remove installed files in uninstall process
if (installType == "bin" if (installType == "bin"
&& package.installAsProgram(tempDestDir.path() + "/" + filename)) { && package.installAsProgram(tempDestDir.path() + "/" + filename)) {
...@@ -382,6 +374,32 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource) ...@@ -382,6 +374,32 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource)
package.installAsFile(tempDestDir.path() + "/" + filename); package.installAsFile(tempDestDir.path() + "/" + filename);
result["message"] = tr("The KWin window switcher has been installed"); result["message"] = tr("The KWin window switcher has been installed");
} }
else if (installType == "cursors"
&& package.installAsArchive(tempSrcDir.path())
&& installThemes("cursors", filename.section(".", 0, 0), tempSrcDir.path(), tempDestDir.path())) {
result["message"] = tr("The cursor theme has been installed");
}
else if (installType == "icons"
&& package.installAsArchive(tempSrcDir.path())
&& installThemes("icons", filename.section(".", 0, 0), tempSrcDir.path(), tempDestDir.path())) {
result["message"] = tr("The icon theme has been installed");
}
else if (installType == "emoticons"
&& package.installAsArchive(tempSrcDir.path())
&& installThemes("emoticons", filename.section(".", 0, 0), tempSrcDir.path(), tempDestDir.path())) {
result["message"] = tr("The emoticon theme has been installed");
}
else if ((installType == "themes"
|| installType == "gnome_shell_themes"
|| installType == "cinnamon_themes"
|| installType == "gtk2_themes"
|| installType == "gtk3_themes"
|| installType == "metacity_themes"
|| installType == "xfwm4_themes")
&& package.installAsArchive(tempSrcDir.path())
&& installThemes("themes", filename.section(".", 0, 0), tempSrcDir.path(), tempDestDir.path())) {
result["message"] = tr("The desktop theme has been installed");
}
else if (package.installAsArchive(tempDestDir.path())) { else if (package.installAsArchive(tempDestDir.path())) {
result["message"] = tr("The archive file has been extracted"); result["message"] = tr("The archive file has been extracted");
} }
...@@ -397,9 +415,7 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource) ...@@ -397,9 +415,7 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource)
return; return;
} }
#else #else
destDir.setPath(configHandler_->getAppConfigInstallTypes()[installType].toObject()["generic_destination"].toString()); if (Qtil::File(package.path()).copy(tempDestDir.path() + "/" + filename)) {
if (qtlib::File(package.path()).copy(tempDestDir.path() + "/" + filename)) {
result["message"] = tr("The file has been installed"); result["message"] = tr("The file has been installed");
} }
else { else {
...@@ -424,15 +440,24 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource) ...@@ -424,15 +440,24 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource)
} }
if (fileInfo.isDir()) { if (fileInfo.isDir()) {
qtlib::Dir(fileInfo.filePath()).move(destDir.path() + "/" + destFilename); Qtil::Dir(fileInfo.filePath()).move(destDir.path() + "/" + destFilename);
} }
else { else {
qtlib::File(fileInfo.filePath()).move(destDir.path() + "/" + destFilename); Qtil::File(fileInfo.filePath()).move(destDir.path() + "/" + destFilename);
} }
installedFiles.append(QJsonValue(destFilename)); installedFiles.append(QJsonValue(destFilename));
} }
if (installedFiles.isEmpty()) {
result["status"] = QString("error_install");
result["message"] = tr("Failed to installation");
emit installFinished(result);
tempDir.remove();
resource->deleteLater();
return;
}
// Installation post-process // Installation post-process
metadata.remove("command"); metadata.remove("command");
metadata["files"] = installedFiles; metadata["files"] = installedFiles;
...@@ -446,3 +471,66 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource) ...@@ -446,3 +471,66 @@ void ItemHandler::installDownloadedFile(qtlib::NetworkResource *resource)
tempDir.remove(); tempDir.remove();
resource->deleteLater(); resource->deleteLater();
} }
#ifdef APP_DESKTOP
bool ItemHandler::installThemes(const QString &installType, const QString &name, const QString &srcDir, const QString &destDir)
{
QStringList themeDirs;
if (installType == "cursors") {
//QDirIterator iterator(srcDir, QStringList() << "index.theme", QDir::Files, QDirIterator::Subdirectories);
QDirIterator iterator(srcDir, QStringList() << "cursors", QDir::Dirs, QDirIterator::Subdirectories);
while (iterator.hasNext()) {
auto path = iterator.next();
path.truncate(path.lastIndexOf("/"));
themeDirs << path;
}
}
else if (installType == "icons") {
QDirIterator iterator(srcDir, QStringList() << "index.theme", QDir::Files, QDirIterator::Subdirectories);
while (iterator.hasNext()) {
auto path = iterator.next();
path.truncate(path.lastIndexOf("/"));
themeDirs << path;
}
}
else if (installType == "emoticons") {
QDirIterator iterator(srcDir, QStringList() << "emoticons.xml", QDir::Files, QDirIterator::Subdirectories);
while (iterator.hasNext()) {
auto path = iterator.next();
path.truncate(path.lastIndexOf("/"));
themeDirs << path;
}
}
else if (installType == "themes") {
/*QDirIterator iterator(srcDir,
QStringList() << "cinnamon"
<< "gnome-shell"
<< "gtk-2.0"
<< "gtk-3.0"
<< "metacity-1"
<< "plank"
<< "unity"
<< "xfwm4",
QDir::Dirs, QDirIterator::Subdirectories);*/
QDirIterator iterator(srcDir, QStringList() << "index.theme", QDir::Files, QDirIterator::Subdirectories);
while (iterator.hasNext()) {
auto path = iterator.next();
path.truncate(path.lastIndexOf("/"));
themeDirs << path;
}
}
if (!themeDirs.isEmpty()) {
for (const auto &themeDir : themeDirs) {
auto themeName = name;
if (themeDir != srcDir) {
themeName = themeDir.split("/").last();
}
Qtil::Dir(themeDir).move(destDir + "/" + themeName);
}
return true;
}
return false;
}
#endif
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <QObject> #include <QObject>
#include <QJsonObject> #include <QJsonObject>
namespace qtlib { namespace Qtil {
class NetworkResource; class NetworkResource;
} }
...@@ -37,13 +37,17 @@ public slots: ...@@ -37,13 +37,17 @@ public slots:
void uninstall(const QString &itemKey); void uninstall(const QString &itemKey);
private slots: private slots:
void networkResourceFinished(qtlib::NetworkResource *resource); void networkResourceFinished(Qtil::NetworkResource *resource);
private: private:
void setMetadataSet(const QJsonObject &metadataSet); void setMetadataSet(const QJsonObject &metadataSet);
void saveDownloadedFile(qtlib::NetworkResource *resource); void saveDownloadedFile(Qtil::NetworkResource *resource);
void installDownloadedFile(qtlib::NetworkResource *resource); void installDownloadedFile(Qtil::NetworkResource *resource);
#ifdef APP_DESKTOP
bool installThemes(const QString &installType, const QString &name, const QString &srcDir, const QString &destDir);
#endif
ConfigHandler *configHandler_; ConfigHandler *configHandler_;
QJsonObject metadataSet_; QJsonObject metadataSet_;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <QStringList> #include <QStringList>
#include <QJsonValue> #include <QJsonValue>
#include "qtlib_ocsapi.h" #include "qtil_ocsapi.h"
#include "handlers/confighandler.h" #include "handlers/confighandler.h"
...@@ -13,9 +13,9 @@ OcsApiHandler::OcsApiHandler(ConfigHandler *configHandler, QObject *parent) ...@@ -13,9 +13,9 @@ OcsApiHandler::OcsApiHandler(ConfigHandler *configHandler, QObject *parent)
bool OcsApiHandler::addProviders(const QString &providerFileUrl) const bool OcsApiHandler::addProviders(const QString &providerFileUrl) const
{ {
auto providers = qtlib::OcsApi::getProviderFile(QUrl(providerFileUrl)); auto providers = Qtil::OcsApi::getProviderFile(QUrl(providerFileUrl));
if (!providers.isEmpty()) { if (!providers.isEmpty()) {
for (const auto &providerValue : providers) { for (const auto providerValue : providers) {
auto provider = providerValue.toObject(); auto provider = providerValue.toObject();
if (provider.contains("location")) { if (provider.contains("location")) {
// Use location (API base URL) as unique key // Use location (API base URL) as unique key
...@@ -60,7 +60,7 @@ bool OcsApiHandler::updateCategories(const QString &providerKey, bool force) con ...@@ -60,7 +60,7 @@ bool OcsApiHandler::updateCategories(const QString &providerKey, bool force) con
} }
auto baseUrl = providers[providerKey].toObject()["location"].toString(); auto baseUrl = providers[providerKey].toObject()["location"].toString();
auto response = qtlib::OcsApi(baseUrl, QUrl(baseUrl)).getContentCategories(); auto response = Qtil::OcsApi(baseUrl, QUrl(baseUrl)).getContentCategories();
if (!response.contains("data")) { if (!response.contains("data")) {
return false; return false;
...@@ -69,7 +69,7 @@ bool OcsApiHandler::updateCategories(const QString &providerKey, bool force) con ...@@ -69,7 +69,7 @@ bool OcsApiHandler::updateCategories(const QString &providerKey, bool force) con
// Data type variation workaround, convert object to array // Data type variation workaround, convert object to array
QJsonArray responseData; QJsonArray responseData;
if (response["data"].isObject()) { if (response["data"].isObject()) {
for (const auto &dataValue : response["data"].toObject()) { for (const auto dataValue : response["data"].toObject()) {
responseData.append(dataValue); responseData.append(dataValue);
} }
} }
...@@ -86,7 +86,7 @@ bool OcsApiHandler::updateCategories(const QString &providerKey, bool force) con ...@@ -86,7 +86,7 @@ bool OcsApiHandler::updateCategories(const QString &providerKey, bool force) con
} }
QJsonObject newProviderCategories; QJsonObject newProviderCategories;
for (const auto &dataValue : responseData) { for (const auto dataValue : responseData) {
auto data = dataValue.toObject(); auto data = dataValue.toObject();
// Data type variation workaround, convert int to string // Data type variation workaround, convert int to string
...@@ -185,7 +185,7 @@ QJsonObject OcsApiHandler::getContents(const QString &providerKeys, const QStrin ...@@ -185,7 +185,7 @@ QJsonObject OcsApiHandler::getContents(const QString &providerKeys, const QStrin
query.addQueryItem("sortmode", sortmode); query.addQueryItem("sortmode", sortmode);
query.addQueryItem("pagesize", QString::number(pagesize)); query.addQueryItem("pagesize", QString::number(pagesize));
query.addQueryItem("page", QString::number(page)); query.addQueryItem("page", QString::number(page));
responseSet[providerKey] = qtlib::OcsApi(baseUrl, QUrl(baseUrl)).getContentDataSet(query); responseSet[providerKey] = Qtil::OcsApi(baseUrl, QUrl(baseUrl)).getContentDataSet(query);
} }
} }
...@@ -198,7 +198,7 @@ QJsonObject OcsApiHandler::getContent(const QString &providerKey, const QString ...@@ -198,7 +198,7 @@ QJsonObject OcsApiHandler::getContent(const QString &providerKey, const QString
auto providers = configHandler_->getUsrConfigProviders(); auto providers = configHandler_->getUsrConfigProviders();
if (providers.contains(providerKey)) { if (providers.contains(providerKey)) {
auto baseUrl = providers[providerKey].toObject()["location"].toString(); auto baseUrl = providers[providerKey].toObject()["location"].toString();
response = qtlib::OcsApi(baseUrl, QUrl(baseUrl)).getContentData(contentId); response = Qtil::OcsApi(baseUrl, QUrl(baseUrl)).getContentData(contentId);
} }
return response; return response;
} }
...@@ -3,27 +3,19 @@ ...@@ -3,27 +3,19 @@
#include <QUrl> #include <QUrl>
#include <QDesktopServices> #include <QDesktopServices>
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
#include <QFileInfo> #include <QFileInfo>
#include <QProcess> #include <QProcess>
#endif #endif
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
#include "qtlib_package.h" #include "qtil_package.h"
#endif #endif
SystemHandler::SystemHandler(QObject *parent) SystemHandler::SystemHandler(QObject *parent)
: QObject(parent) : QObject(parent)
{} {}
bool SystemHandler::isUnix() const
{
#ifdef QTLIB_UNIX
return true;
#endif
return false;
}
bool SystemHandler::isMobileDevice() const bool SystemHandler::isMobileDevice() const
{ {
#if defined(APP_MOBILE) #if defined(APP_MOBILE)
...@@ -42,7 +34,7 @@ bool SystemHandler::openUrl(const QString &url) const ...@@ -42,7 +34,7 @@ bool SystemHandler::openUrl(const QString &url) const
path.replace("file://localhost", "", Qt::CaseInsensitive); path.replace("file://localhost", "", Qt::CaseInsensitive);
path.replace("file://", "", Qt::CaseInsensitive); path.replace("file://", "", Qt::CaseInsensitive);
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
if ((path.endsWith(".appimage", Qt::CaseInsensitive) || path.endsWith(".exe", Qt::CaseInsensitive)) if ((path.endsWith(".appimage", Qt::CaseInsensitive) || path.endsWith(".exe", Qt::CaseInsensitive))
&& QFileInfo(path).isExecutable()) { && QFileInfo(path).isExecutable()) {
return QProcess::startDetached(path); return QProcess::startDetached(path);
...@@ -51,7 +43,7 @@ bool SystemHandler::openUrl(const QString &url) const ...@@ -51,7 +43,7 @@ bool SystemHandler::openUrl(const QString &url) const
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
if (path.endsWith(".apk", Qt::CaseInsensitive)) { if (path.endsWith(".apk", Qt::CaseInsensitive)) {
return qtlib::Package(path).installAsApk(); return Qtil::Package(path).installAsApk();
} }
#endif #endif
......
...@@ -10,7 +10,6 @@ public: ...@@ -10,7 +10,6 @@ public:
explicit SystemHandler(QObject *parent = nullptr); explicit SystemHandler(QObject *parent = nullptr);
public slots: public slots:
bool isUnix() const;
bool isMobileDevice() const; bool isMobileDevice() const;
bool openUrl(const QString &url) const; bool openUrl(const QString &url) const;
}; };
...@@ -3,27 +3,22 @@ ...@@ -3,27 +3,22 @@
#include <QStringList> #include <QStringList>
#include <QJsonValue> #include <QJsonValue>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonObject>
#include <QDateTime> #include <QDateTime>
#include <QThread>
#include <QDebug>
#ifdef QTLIB_UNIX #include "qtil_file.h"
#include "appimage/update.h"
#endif
#include "qtlib_file.h"
#include "handlers/confighandler.h" #include "handlers/confighandler.h"
#ifdef APP_DESKTOP
#include "updaters/appimageupdater.h"
#endif
UpdateHandler::UpdateHandler(ConfigHandler *configHandler, QObject *parent) UpdateHandler::UpdateHandler(ConfigHandler *configHandler, QObject *parent)
: QObject(parent), configHandler_(configHandler) : QObject(parent), configHandler_(configHandler)
{} {}
void UpdateHandler::checkAll() void UpdateHandler::checkAll()
{ {
emit checkAllStarted();
// Resets data // Resets data
QJsonObject updateAvailableItems; QJsonObject updateAvailableItems;
configHandler_->setUsrConfigUpdateAvailableItems(updateAvailableItems); configHandler_->setUsrConfigUpdateAvailableItems(updateAvailableItems);
...@@ -31,32 +26,29 @@ void UpdateHandler::checkAll() ...@@ -31,32 +26,29 @@ void UpdateHandler::checkAll()
auto installedItems = configHandler_->getUsrConfigInstalledItems(); auto installedItems = configHandler_->getUsrConfigInstalledItems();
if (installedItems.isEmpty()) { if (installedItems.isEmpty()) {
emit checkAllFinished(); emit checkAllStarted(false);
return; return;
} }
emit checkAllStarted(true);
for (const auto &itemKey : installedItems.keys()) { for (const auto &itemKey : installedItems.keys()) {
auto installedItem = installedItems[itemKey].toObject(); auto installedItem = installedItems[itemKey].toObject();
auto filename = installedItem["filename"].toString(); auto filename = installedItem["filename"].toString();
auto installType = installedItem["install_type"].toString(); auto installType = installedItem["install_type"].toString();
qtlib::File file; auto filePath = configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString() + "/" + filename;
#ifdef QTLIB_UNIX
file.setPath(configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString() + "/" + filename);
#else
file.setPath(configHandler_->getAppConfigInstallTypes()[installType].toObject()["generic_destination"].toString() + "/" + filename);
#endif
QString updateMethod = ""; QString updateMethod = "";
if (installType == "bin") { if (installType == "bin") {
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
if (file.path().endsWith(".appimage", Qt::CaseInsensitive)) { if (filePath.endsWith(".appimage", Qt::CaseInsensitive)) {
if (checkAppImage(file.path())) { if (AppImageUpdater(itemKey, filePath).checkForChanges()) {
updateMethod = "appimageupdate"; updateMethod = "appimageupdate";
} }
//else if (checkAppImageWithOcsApi(itemKey)) { //else if (OcsFileUpdater(url).checkFile()) {
// updateMethod = "appimageupdatewithocsapi"; // updateMethod = "appimageupdate_ocs";
//} //}
} }
#endif #endif
...@@ -75,7 +67,7 @@ void UpdateHandler::checkAll() ...@@ -75,7 +67,7 @@ void UpdateHandler::checkAll()
application["update_checked_at"] = QDateTime::currentMSecsSinceEpoch(); application["update_checked_at"] = QDateTime::currentMSecsSinceEpoch();
configHandler_->setUsrConfigApplication(application); configHandler_->setUsrConfigApplication(application);
emit checkAllFinished(); emit checkAllFinished(true);
} }
void UpdateHandler::update(const QString &itemKey) void UpdateHandler::update(const QString &itemKey)
...@@ -83,43 +75,61 @@ void UpdateHandler::update(const QString &itemKey) ...@@ -83,43 +75,61 @@ void UpdateHandler::update(const QString &itemKey)
auto updateAvailableItems = configHandler_->getUsrConfigUpdateAvailableItems(); auto updateAvailableItems = configHandler_->getUsrConfigUpdateAvailableItems();
if (!updateAvailableItems.contains(itemKey)) { if (!updateAvailableItems.contains(itemKey)) {
emit updateStarted(itemKey, false);
return; return;
} }
auto updateMethod = updateAvailableItems[itemKey].toObject()["update_method"].toString(); auto updateMethod = updateAvailableItems[itemKey].toObject()["update_method"].toString();
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
if (updateMethod == "appimageupdate") { if (updateMethod == "appimageupdate") {
updateAppImage(itemKey); updateAppImage(itemKey);
} }
//else if (updateMethod == "appimageupdatewithocsapi") { //else if (updateMethod == "appimageupdate_ocs") {
// updateAppImageWithOcsApi(itemKey); // updateAppImageOcs(itemKey);
//} //}
#endif #endif
} }
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
QString UpdateHandler::describeAppImage(const QString &path) const void UpdateHandler::appImageUpdaterFinished(AppImageUpdater *updater)
{ {
appimage::update::Updater appImageUpdater(path.toStdString()); auto itemKey = updater->id();
QString updateInformation;
std::string description; auto metadata = metadataSet_[itemKey].toObject();
if (appImageUpdater.describeAppImage(description)) { metadataSet_.remove(itemKey);
updateInformation = QString::fromStdString(description);
if (!updater->isFinishedWithNoError()) {
emit updateFinished(itemKey, false);
updater->deleteLater();
return;
} }
return updateInformation;
}
bool UpdateHandler::checkAppImage(const QString &path) const auto installedItemKey = metadata["installed_item_key"].toString();
{ auto installedItem = metadata["installed_item_obj"].toObject();
appimage::update::Updater appImageUpdater(path.toStdString()); auto newFilename = metadata["new_filename"].toString();
bool updateAvailable; auto filename = installedItem["filename"].toString();
if (appImageUpdater.checkForChanges(updateAvailable)) {
return updateAvailable; installedItem["filename"] = newFilename;
QJsonArray files;
files.append(QJsonValue(newFilename));
installedItem["files"] = files;
installedItem["installed_at"] = QDateTime::currentMSecsSinceEpoch();
configHandler_->setUsrConfigInstalledItemsItem(installedItemKey, installedItem);
if (newFilename != filename) {
Qtil::File(updater->path()).remove();
} }
return false;
configHandler_->removeUsrConfigUpdateAvailableItemsItem(itemKey);
emit updateFinished(itemKey, true);
updater->deleteLater();
} }
#endif
#ifdef APP_DESKTOP
void UpdateHandler::updateAppImage(const QString &itemKey) void UpdateHandler::updateAppImage(const QString &itemKey)
{ {
auto updateAvailableItem = configHandler_->getUsrConfigUpdateAvailableItems()[itemKey].toObject(); auto updateAvailableItem = configHandler_->getUsrConfigUpdateAvailableItems()[itemKey].toObject();
...@@ -127,64 +137,49 @@ void UpdateHandler::updateAppImage(const QString &itemKey) ...@@ -127,64 +137,49 @@ void UpdateHandler::updateAppImage(const QString &itemKey)
auto installedItems = configHandler_->getUsrConfigInstalledItems(); auto installedItems = configHandler_->getUsrConfigInstalledItems();
if (!installedItems.contains(installedItemKey)) { if (!installedItems.contains(installedItemKey)) {
emit updateStarted(itemKey, false);
return; return;
} }
auto installedItem = installedItems[installedItemKey].toObject(); auto installedItem = installedItems[installedItemKey].toObject();
auto filename = installedItem["filename"].toString(); auto filename = installedItem["filename"].toString();
auto installType = installedItem["install_type"].toString(); auto installType = installedItem["install_type"].toString();
auto filePath = configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString() + "/" + filename;
qtlib::File file(configHandler_->getAppConfigInstallTypes()[installType].toObject()["destination"].toString() + "/" + filename); auto *updater = new AppImageUpdater(itemKey, filePath, this);
connect(updater, &AppImageUpdater::updateProgress, this, &UpdateHandler::updateProgress);
connect(updater, &AppImageUpdater::finished, this, &UpdateHandler::appImageUpdaterFinished);
auto newFilename = filename; QJsonObject metadata;
auto updateInformation = describeAppImage(file.path()); metadata["installed_item_key"] = installedItemKey;
for (const auto &info : updateInformation.split("\n")) { metadata["installed_item_obj"] = installedItem;
if (info.endsWith(".zsync", Qt::CaseInsensitive)) { metadata["new_filename"] = filename;
newFilename = info.split("|").last().split("/").last().replace(".zsync", "", Qt::CaseInsensitive);
break;
}
}
appimage::update::Updater appImageUpdater(file.path().toStdString(), false); QString assembledNewFilename = "";
QString rawNewFilename = "";
if (!appImageUpdater.start()) {
return;
}
emit updateStarted(itemKey); auto updateInformation = updater->describeAppImage();
for (const auto &info : updateInformation.split("\n")) {
while (!appImageUpdater.isDone()) { if (info.endsWith(".zsync", Qt::CaseInsensitive)) {
QThread::msleep(100); if (info.startsWith("Assembled ZSync URL:", Qt::CaseInsensitive)) {
double progress; assembledNewFilename = info.split("/").last().replace(".zsync", "", Qt::CaseInsensitive);
if (appImageUpdater.progress(progress)) { }
emit updateProgress(itemKey, progress * 100); else if (info.startsWith("Raw update information:", Qt::CaseInsensitive)) {
rawNewFilename = info.split("|").last().split("/").last().replace(".zsync", "", Qt::CaseInsensitive);
}
} }
} }
if (appImageUpdater.hasError()) { if (!assembledNewFilename.isEmpty()) {
std::string nextMessage; metadata["new_filename"] = assembledNewFilename;
while (appImageUpdater.nextStatusMessage(nextMessage)) {
qWarning() << QString::fromStdString(nextMessage);
}
emit updateFinished(itemKey);
return;
} }
else if (!rawNewFilename.isEmpty() && !rawNewFilename.contains("*")) {
installedItem["filename"] = newFilename; metadata["new_filename"] = rawNewFilename;
QJsonArray files;
files.append(QJsonValue(newFilename));
installedItem["files"] = files;
installedItem["installed_at"] = QDateTime::currentMSecsSinceEpoch();
configHandler_->setUsrConfigInstalledItemsItem(installedItemKey, installedItem);
if (newFilename != filename) {
file.remove();
} }
configHandler_->removeUsrConfigUpdateAvailableItemsItem(itemKey); metadataSet_[itemKey] = metadata;
emit updateFinished(itemKey); emit updateStarted(itemKey, true);
updater->start();
} }
#endif #endif
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QJsonObject>
class ConfigHandler; class ConfigHandler;
#ifdef APP_DESKTOP
class AppImageUpdater;
#endif
class UpdateHandler : public QObject class UpdateHandler : public QObject
{ {
Q_OBJECT Q_OBJECT
...@@ -12,22 +17,26 @@ public: ...@@ -12,22 +17,26 @@ public:
explicit UpdateHandler(ConfigHandler *configHandler, QObject *parent = nullptr); explicit UpdateHandler(ConfigHandler *configHandler, QObject *parent = nullptr);
signals: signals:
void checkAllStarted(); void checkAllStarted(bool status);
void checkAllFinished(); void checkAllFinished(bool status);
void updateStarted(QString itemKey); void updateStarted(QString itemKey, bool status);
void updateFinished(QString itemKey); void updateFinished(QString itemKey, bool status);
void updateProgress(QString itemKey, int progress); void updateProgress(QString itemKey, double progress);
public slots: public slots:
void checkAll(); void checkAll();
void update(const QString &itemKey); void update(const QString &itemKey);
private slots:
#ifdef APP_DESKTOP
void appImageUpdaterFinished(AppImageUpdater *updater);
#endif
private: private:
#ifdef QTLIB_UNIX #ifdef APP_DESKTOP
QString describeAppImage(const QString &path) const;
bool checkAppImage(const QString &path) const;
void updateAppImage(const QString &itemKey); void updateAppImage(const QString &itemKey);
#endif #endif
ConfigHandler *configHandler_; ConfigHandler *configHandler_;
QJsonObject metadataSet_;
}; };
...@@ -16,6 +16,9 @@ int main(int argc, char *argv[]) ...@@ -16,6 +16,9 @@ int main(int argc, char *argv[])
// Init // Init
QGuiApplication app(argc, argv); // This is backend program, but need GUI module QGuiApplication app(argc, argv); // This is backend program, but need GUI module
auto envPath = QString::fromLocal8Bit(qgetenv("PATH").constData()) + ":" + app.applicationDirPath();
qputenv("PATH", envPath.toUtf8().constData());
auto *configHandler = new ConfigHandler(&app); auto *configHandler = new ConfigHandler(&app);
auto appConfigApplication = configHandler->getAppConfigApplication(); auto appConfigApplication = configHandler->getAppConfigApplication();
...@@ -44,7 +47,7 @@ int main(int argc, char *argv[]) ...@@ -44,7 +47,7 @@ int main(int argc, char *argv[])
clParser.process(app); clParser.process(app);
auto port = clParser.value(clOptionPort).toInt(); auto port = clParser.value(clOptionPort).toUShort();
// Setup websocket server // Setup websocket server
auto *wsServer = new WebSocketServer(configHandler, appConfigApplication["id"].toString(), port, &app); auto *wsServer = new WebSocketServer(configHandler, appConfigApplication["id"].toString(), port, &app);
......
#include "appimageupdater.h" #include "appimageupdater.h"
#include <QThread> #include <QTimer>
#include "appimage/update.h" #include "appimage/update.h"
...@@ -9,6 +9,12 @@ AppImageUpdater::AppImageUpdater(const QString &id, const QString &path, QObject ...@@ -9,6 +9,12 @@ AppImageUpdater::AppImageUpdater(const QString &id, const QString &path, QObject
{ {
isFinishedWithNoError_ = false; isFinishedWithNoError_ = false;
errorString_ = ""; errorString_ = "";
updater_ = new appimage::update::Updater(path_.toStdString(), false);
}
AppImageUpdater::~AppImageUpdater()
{
delete updater_;
} }
QString AppImageUpdater::id() const QString AppImageUpdater::id() const
...@@ -21,44 +27,63 @@ QString AppImageUpdater::path() const ...@@ -21,44 +27,63 @@ QString AppImageUpdater::path() const
return path_; return path_;
} }
bool AppImageUpdater::isFinishedWithNoError() const
{
return isFinishedWithNoError_;
}
QString AppImageUpdater::errorString() const
{
return errorString_;
}
QString AppImageUpdater::describeAppImage() const QString AppImageUpdater::describeAppImage() const
{ {
std::string description = ""; std::string description;
appimage::update::Updater updater(path_.toStdString()); if (updater_->describeAppImage(description)) {
updater.describeAppImage(description); return QString::fromStdString(description);
return QString::fromStdString(description); }
return QString();
} }
bool AppImageUpdater::checkAppImage() const bool AppImageUpdater::checkForChanges() const
{ {
bool updateAvailable = false; bool updateAvailable;
appimage::update::Updater updater(path_.toStdString()); if (updater_->checkForChanges(updateAvailable)) {
updater.checkForChanges(updateAvailable); return updateAvailable;
return updateAvailable; }
return false;
} }
void AppImageUpdater::updateAppImage() void AppImageUpdater::start()
{ {
isFinishedWithNoError_ = false; isFinishedWithNoError_ = false;
errorString_ = ""; errorString_ = "";
appimage::update::Updater updater(path_.toStdString(), false);
if (!updater.start()) { if (!updater_->start()) {
emit finished(this); emit finished(this);
return; return;
} }
while (!updater.isDone()) { auto timer = new QTimer(this);
QThread::msleep(100); connect(timer, &QTimer::timeout, this, &AppImageUpdater::checkProgress);
connect(this, &AppImageUpdater::finished, timer, &QTimer::stop);
timer->start(100);
}
void AppImageUpdater::checkProgress()
{
if (!updater_->isDone()) {
double progress; double progress;
if (updater.progress(progress)) { if (updater_->progress(progress)) {
emit updateProgress(id_, progress); emit updateProgress(id_, progress);
} }
return;
} }
if (updater.hasError()) { if (updater_->hasError()) {
std::string message; std::string message;
while (updater.nextStatusMessage(message)) { while (updater_->nextStatusMessage(message)) {
errorString_ += QString::fromStdString(message) + "\n"; errorString_ += QString::fromStdString(message) + "\n";
} }
emit finished(this); emit finished(this);
...@@ -68,13 +93,3 @@ void AppImageUpdater::updateAppImage() ...@@ -68,13 +93,3 @@ void AppImageUpdater::updateAppImage()
isFinishedWithNoError_ = true; isFinishedWithNoError_ = true;
emit finished(this); emit finished(this);
} }
bool AppImageUpdater::isFinishedWithNoError() const
{
return isFinishedWithNoError_;
}
QString AppImageUpdater::errorString() const
{
return errorString_;
}