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-url
  • ab3875o/ocs-url
  • dembego3/ocs-url
  • arakun/ocs-url
  • longviauroy/ocs-url
  • rolfen/ocs-url
  • hemm/ocs-url
  • simonsvw0000/ocs-url
  • dfn2/ocs-url
  • rws77/ocs-url
  • bitwalk/ocs-url
  • visdom/ocs-url
  • ricatfarker/ocs-url
  • mussah/ocs-url
  • tigefa/ocs-url
  • cobalt2727/ocs-url
  • ammark226/ocs-url
  • violethaze74/ocs-url
  • armedssault/ocs-url
  • billflick/ocs-url
  • kimblejeremy/ocs-url
  • yuvrajsm/ocs-url
  • wawmart/ocs-url
  • jhefry/ocs-url
  • robcdntruckin/ocs-url
  • bigmake2266/ocs-url
  • kamil-chbeir/ocs-url
  • jocker73/ocs-url
  • laboties/ocs-url
  • smekke61279-522014/ocs-url
  • coolduck/ocs-url
  • zulfikar-lahiya/ocs-url
  • faz-83/ocs-url
  • dado105/ocs-url
34 results
Show changes
Showing
with 127 additions and 936 deletions
#!/bin/bash
PKGNAME='ocs-url'
PKGUSER='pkgbuilder'
PKGSCRIPT="${0}"
PROJDIR="$(cd "$(dirname "${0}")/../" && pwd)"
BUILDDIR="${PROJDIR}/build_${PKGNAME}"
ubuntu_deb() { # docker-image: ubuntu:14.04
install_build_deps_ubuntu_deb
add_pkguser
su -c "export HOME=/home/${PKGUSER} && "${PKGSCRIPT}" build_ubuntu_deb" ${PKGUSER}
}
install_build_deps_ubuntu_deb() {
apt update -qq
apt -y install curl git
apt -y install build-essential qt5-default libqt5svg5-dev qtdeclarative5-dev
apt -y install devscripts debhelper fakeroot
}
build_ubuntu_deb() {
rm -rf "${BUILDDIR}"
mkdir -p "${BUILDDIR}"
export_srcarchive "${BUILDDIR}/${PKGNAME}.tar.gz"
tar -xzf "${BUILDDIR}/${PKGNAME}.tar.gz" -C "${BUILDDIR}"
cp -r "${PROJDIR}/pkg/ubuntu/debian" "${BUILDDIR}/${PKGNAME}"
cd "${BUILDDIR}/${PKGNAME}"
debuild -uc -us -b
}
fedora_rpm() { # docker-image: fedora:20
install_build_deps_fedora_rpm
add_pkguser
su -c "export HOME=/home/${PKGUSER} && "${PKGSCRIPT}" build_fedora_rpm" ${PKGUSER}
}
install_build_deps_fedora_rpm() {
yum -y install curl git
yum -y install make automake gcc gcc-c++ libtool qt5-qtbase-devel qt5-qtsvg-devel qt5-qtdeclarative-devel
yum -y install rpm-build
}
build_fedora_rpm() {
rm -rf "${BUILDDIR}"
mkdir -p "${BUILDDIR}"
mkdir "${BUILDDIR}/SOURCES"
mkdir "${BUILDDIR}/SPECS"
export_srcarchive "${BUILDDIR}/SOURCES/${PKGNAME}.tar.gz"
cp "${PROJDIR}/pkg/fedora/${PKGNAME}.spec" "${BUILDDIR}/SPECS"
rpmbuild --define "_topdir ${BUILDDIR}" -bb "${BUILDDIR}/SPECS/${PKGNAME}.spec"
}
opensuse_rpm() { # docker-image: opensuse:42.3
install_build_deps_opensuse_rpm
add_pkguser
su -c "export HOME=/home/${PKGUSER} && "${PKGSCRIPT}" build_opensuse_rpm" ${PKGUSER}
}
install_build_deps_opensuse_rpm() {
zypper --non-interactive refresh
zypper --non-interactive install curl git
zypper --non-interactive install make automake gcc gcc-c++ libtool libqt5-qtbase-devel libqt5-qtsvg-devel libqt5-qtdeclarative-devel
zypper --non-interactive install rpm-build
}
build_opensuse_rpm() {
rm -rf "${BUILDDIR}"
mkdir -p "${BUILDDIR}"
mkdir "${BUILDDIR}/SOURCES"
mkdir "${BUILDDIR}/SPECS"
export_srcarchive "${BUILDDIR}/SOURCES/${PKGNAME}.tar.gz"
cp "${PROJDIR}/pkg/opensuse/${PKGNAME}.spec" "${BUILDDIR}/SPECS"
rpmbuild --define "_topdir ${BUILDDIR}" -bb "${BUILDDIR}/SPECS/${PKGNAME}.spec"
}
archlinux_pkg() { # docker-image: archlinux/base:latest
install_build_deps_archlinux_pkg
add_pkguser
su -c "export HOME=/home/${PKGUSER} && "${PKGSCRIPT}" build_archlinux_pkg" ${PKGUSER}
}
install_build_deps_archlinux_pkg() {
pacman -Syu --noconfirm
pacman -S --noconfirm curl git
pacman -S --noconfirm base-devel qt5-base qt5-svg qt5-declarative qt5-quickcontrols
pacman -S --noconfirm pacman-contrib
}
build_archlinux_pkg() {
rm -rf "${BUILDDIR}"
mkdir -p "${BUILDDIR}"
export_srcarchive "${BUILDDIR}/${PKGNAME}.tar.gz"
cp "${PROJDIR}/pkg/archlinux/PKGBUILD" "${BUILDDIR}"
cd "${BUILDDIR}"
updpkgsums
makepkg -s
}
add_pkguser() {
useradd -m ${PKGUSER}
chown -R ${PKGUSER} "${PROJDIR}"
}
export_srcarchive() {
if [ "${1}" ]; then
(cd "${PROJDIR}" && git archive --prefix="${PKGNAME}/" --output="${1}" HEAD)
fi
}
if [ "${1}" ]; then
${1}
fi
#!/bin/bash
PROJDIR="$(cd "$(dirname "${0}")/../" && pwd)"
if [ ! -d "${PROJDIR}/lib/qtil" ]; then
git clone https://github.com/akiraohgaki/qtil.git -b release-0.4.0 --single-branch --depth=1 "${PROJDIR}/lib/qtil"
fi
DISTFILES += \
$${PWD}/package \
$${PWD}/prepare
<RCC>
<qresource prefix="/">
<file>configs/application.json</file>
<file>configs/archive_types.json</file>
<file>configs/destinations.json</file>
<file>configs/destinations_alias.json</file>
</qresource>
</RCC>
{
"id": "xdgurl",
"name": "xdgurl",
"version": "1.1.0",
"organization": "xdgurl",
"domain": "com.xdgurl.xdgurl",
"icon": ":/desktop/xdgurl.svg",
"description": "An install helper program for desktop stuff.",
"license": "GPL-3+",
"author": "Akira Ohgaki",
"contact": "akiraohgaki@gmail.com",
"homepage": "https://github.com/xdgurl/xdgurl"
}
{
"application/x-tar": "tar",
"application/x-gzip": "tar",
"application/gzip": "tar",
"application/x-bzip": "tar",
"application/x-bzip2": "tar",
"application/x-xz": "tar",
"application/x-lzma": "tar",
"application/x-lzip": "tar",
"application/x-compressed-tar": "tar",
"application/x-bzip-compressed-tar": "tar",
"application/x-bzip2-compressed-tar": "tar",
"application/x-xz-compressed-tar": "tar",
"application/x-lzma-compressed-tar": "tar",
"application/x-lzip-compressed-tar": "tar",
"application/zip": "zip",
"application/x-7z-compressed": "7z",
"application/x-rar": "rar",
"application/x-rar-compressed": "rar"
}
{
"downloads": "$HOME/Downloads",
"documents": "$HOME/Documents",
"pictures": "$HOME/Pictures",
"music": "$HOME/Music",
"videos": "$HOME/Videos",
"wallpapers": "$XDG_DATA/wallpapers",
"fonts": "$HOME/.fonts",
"cursors": "$HOME/.icons",
"icons": "$XDG_DATA/icons",
"emoticons": "$XDG_DATA/emoticons",
"themes": "$HOME/.themes",
"emerald_themes": "$HOME/.emerald/themes",
"enlightenment_themes": "$HOME/.e/e/themes",
"enlightenment_backgrounds": "$HOME/.e/e/backgrounds",
"fluxbox_styles": "$HOME/.fluxbox/styles",
"pekwm_themes": "$HOME/.pekwm/themes",
"icewm_themes": "$HOME/.icewm/themes",
"plasma_plasmoids": "$XDG_DATA/plasma/plasmoids",
"plasma_look_and_feel": "$XDG_DATA/plasma/look-and-feel",
"plasma_desktopthemes": "$XDG_DATA/plasma/desktoptheme",
"kwin_effects": "$XDG_DATA/kwin/effects",
"kwin_scripts": "$XDG_DATA/kwin/scripts",
"kwin_tabbox": "$XDG_DATA/kwin/tabbox",
"aurorae_themes": "$XDG_DATA/aurorae/themes",
"dekorator_themes": "$XDG_DATA/deKorator/themes",
"qtcurve": "$XDG_DATA/QtCurve",
"color_schemes": "$XDG_DATA/color-schemes",
"gnome_shell_extensions": "$XDG_DATA/gnome-shell/extensions",
"cinnamon_applets": "$XDG_DATA/cinnamon/applets",
"cinnamon_desklets": "$XDG_DATA/cinnamon/desklets",
"cinnamon_extensions": "$XDG_DATA/cinnamon/extensions",
"nautilus_scripts": "$XDG_DATA/nautilus/scripts",
"amarok_scripts": "$KDE_DATA/apps/amarok/scripts",
"yakuake_skins": "$KDE_DATA/apps/yakuake/skins",
"cairo_clock_themes": "$HOME/.cairo-clock/themes"
}
{
"gnome_shell_themes": "themes",
"cinnamon_themes": "themes",
"gtk2_themes": "themes",
"gtk3_themes": "themes",
"metacity_themes": "themes",
"xfwm4_themes": "themes",
"openbox_themes": "themes",
"kvantum_themes": "themes",
"compiz_themes": "emerald_themes",
"beryl_themes": "emerald_themes",
"plasma4_plasmoids": "plasma_plasmoids",
"plasma5_plasmoids": "plasma_plasmoids",
"plasma5_look_and_feel": "plasma_look_and_feel",
"plasma5_desktopthemes": "plasma_desktopthemes",
"plasma_color_schemes": "color_schemes"
}
#include "../utility/file.h"
#include "../utility/json.h"
#include "config.h"
namespace Core {
Config::Config(const QString &configsDir, QObject *parent) :
QObject(parent), _configsDir(configsDir)
{}
QJsonObject Config::get(const QString &name)
{
QString configFile = _configsDir + "/" + name + ".json";
if (!_cacheData.contains(name)) {
QString json = Utility::File::readText(configFile);
if (json.isEmpty()) {
json = "{}"; // Blank JSON data as default
}
_cacheData[name] = Utility::Json::convertStrToObj(json);
}
return _cacheData[name].toObject();
}
bool Config::set(const QString &name, const QJsonObject &jsonObj)
{
QString configFile = _configsDir + "/" + name + ".json";
QString json = Utility::Json::convertObjToStr(jsonObj);
Utility::File::makeDir(_configsDir);
if (Utility::File::writeText(configFile, json)) {
_cacheData[name] = jsonObj;
return true;
}
return false;
}
} // namespace Core
#ifndef CORE_CONFIG_H
#define CORE_CONFIG_H
#include <QObject>
#include <QJsonObject>
namespace Core {
class Config : public QObject
{
Q_OBJECT
private:
QString _configsDir;
QJsonObject _cacheData;
public:
explicit Config(const QString &configsDir, QObject *parent = 0);
QJsonObject get(const QString &name);
bool set(const QString &name, const QJsonObject &jsonObj);
};
} // namespace Core
#endif // CORE_CONFIG_H
#include <QEventLoop>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include "network.h"
namespace Core {
Network::Network(const bool &async, QObject *parent) :
QObject(parent), _async(async)
{
_manager = new QNetworkAccessManager();
connect(_manager, &QNetworkAccessManager::finished,
this, &Network::_finished);
if (!_async) {
_eventLoop = new QEventLoop();
connect(_manager, &QNetworkAccessManager::finished,
_eventLoop, &QEventLoop::quit);
}
}
Network::~Network()
{
_manager->deleteLater();
if (!_async) {
delete _eventLoop;
}
}
QNetworkReply *Network::head(const QUrl &uri)
{
QNetworkReply *reply = _manager->head(QNetworkRequest(uri));
if (!_async) {
_eventLoop->exec();
}
return reply;
}
QNetworkReply *Network::get(const QUrl &uri)
{
QNetworkReply *reply = _manager->get(QNetworkRequest(uri));
connect(reply, &QNetworkReply::downloadProgress,
this, &Network::_downloadProgress);
if (!_async) {
_eventLoop->exec();
}
return reply;
}
/**
* Private slots
*/
void Network::_finished(QNetworkReply *reply)
{
emit finished(reply);
}
void Network::_downloadProgress(const qint64 &received, const qint64 &total)
{
emit downloadProgress(received, total);
}
} // namespace Core
#ifndef CORE_NETWORK_H
#define CORE_NETWORK_H
#include <QObject>
class QEventLoop;
class QNetworkAccessManager;
class QNetworkReply;
namespace Core {
class Network : public QObject
{
Q_OBJECT
private:
bool _async;
QNetworkAccessManager *_manager;
QEventLoop *_eventLoop;
public:
explicit Network(const bool &async = true, QObject *parent = 0);
~Network();
QNetworkReply *head(const QUrl &uri);
QNetworkReply *get(const QUrl &uri);
private slots:
void _finished(QNetworkReply *reply);
void _downloadProgress(const qint64 &received, const qint64 &total);
signals:
void finished(QNetworkReply *reply);
void downloadProgress(const qint64 &received, const qint64 &total);
};
} // namespace Core
#endif // CORE_NETWORK_H
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
id="svg2"
viewBox="0 0 1000 1000"
height="1000"
width="1000">
<defs
id="defs4" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-52.362161)"
id="layer1">
<circle
r="475"
cy="552.36218"
cx="500"
id="path4138"
style="fill:#19a2ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<circle
r="450"
cy="552.36218"
cx="500"
id="path4138-0"
style="fill:#53b2ff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
transform="translate(0,20)"
id="g4205">
<path
id="path4145"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:Futura;-inkscape-font-specification:'Futura Medium';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 192.87313,533.47911 -74.36008,-101.11803 56.93857,0 46.10326,64.24502 46.95309,-64.24502 58.63824,0 -76.48467,101.11803 88.59474,119.21524 -56.93858,0 -60.76282,-82.34221 -62.25002,82.34221 -58.42577,0 91.99404,-119.21524 z" />
<path
id="path4147"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:Futura;-inkscape-font-specification:'Futura Medium';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 472.62967,312.47491 48.01537,0 0,340.84056 -48.01537,0 0,-21.67066 c -18.83789,18.41297 -40.15445,27.61946 -63.94968,27.61946 -28.32765,0 -51.83961,-10.33959 -70.53586,-31.01878 -18.55461,-21.1041 -27.83192,-47.44882 -27.83192,-79.03415 0,-30.87715 9.27731,-56.65531 27.83192,-77.3345 18.41298,-20.82082 41.57084,-31.23123 69.47357,-31.23123 24.22015,0 45.8908,9.91468 65.01197,29.74403 z M 359.17742,549.21134 c 0,19.82935 5.31143,35.97612 15.9343,48.44029 10.90615,12.60581 24.64506,18.90871 41.21674,18.90871 17.70478,0 32.01024,-6.09045 42.91639,-18.27134 10.90615,-12.60581 16.35922,-28.61093 16.35922,-48.01537 0,-19.40445 -5.45307,-35.40957 -16.35922,-48.01538 -10.90615,-12.32253 -25.06997,-18.48379 -42.49148,-18.48379 -16.43004,0 -30.16895,6.23208 -41.21673,18.69625 -10.90615,12.60581 -16.35922,28.18602 -16.35922,46.74063 z" />
<path
id="path4149"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:medium;line-height:125%;font-family:Futura;-inkscape-font-specification:'Futura Medium';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 722.24998,648.95295 c 0,9.77304 -0.3541,18.34215 -1.06229,25.70734 -0.56655,7.50683 -1.41638,14.09301 -2.54949,19.75854 -3.39932,15.58021 -10.05632,28.96502 -19.97099,40.15445 -18.69625,21.52901 -44.4036,32.29352 -77.12204,32.29352 -27.61947,0 -50.35241,-7.43601 -68.19883,-22.30802 -18.41297,-15.29693 -29.03584,-36.47186 -31.86861,-63.52477 l 48.01537,0 c 1.8413,10.19796 4.88652,18.05889 9.13567,23.58278 9.91468,12.88908 24.36178,19.33362 43.34131,19.33362 34.98465,0 52.47698,-21.4582 52.47698,-64.37459 l 0,-28.89421 c -18.97953,19.40444 -40.86264,29.10666 -65.64934,29.10666 -28.18601,0 -51.27305,-10.19795 -69.26111,-30.59386 -18.1297,-20.67919 -27.19455,-46.52817 -27.19455,-77.54695 0,-30.16895 8.42748,-55.80548 25.28243,-76.90959 18.1297,-22.37884 42.06657,-33.56826 71.81061,-33.56826 26.06144,0 47.73209,9.70222 65.01196,29.10666 l 0,-27.37031 47.80292,0 z m -45.8908,-98.15532 c 0,-20.11264 -5.38225,-36.18859 -16.14676,-48.22784 C 649.30627,490.24726 635.3549,484.086 618.35831,484.086 c -18.1297,0 -32.43517,6.72782 -42.9164,20.18345 -9.48976,12.03925 -14.23464,27.61946 -14.23464,46.74063 0,18.83789 4.74488,34.27647 14.23464,46.31572 10.33959,13.17236 24.64506,19.75854 42.9164,19.75854 18.27133,0 32.71844,-6.657 43.34131,-19.971 9.77304,-12.03925 14.65956,-27.47782 14.65956,-46.31571 z" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 739.50519,490.21255 36,0 0,36 -36,0 z"
id="rect4156" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 739.53345,589.21057 36,0 0,36 -36,0 z"
id="rect4156-9" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 852.99238,412.46896 22,0 -94.33913,290.17369 -22,0 z"
id="rect4156-5" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 902.99238,412.46896 22,0 -94.33913,290.17369 -22,0 z"
id="rect4156-5-3" />
</g>
</g>
</svg>
#include <QDebug>
#include <QUrl>
#include <QUrlQuery>
#include <QMimeDatabase>
#include <QProcess>
#include "../core/config.h"
#include "../core/network.h"
#include "../utility/file.h"
#include "../utility/json.h"
#include "xdgurl.h"
namespace Handlers {
XdgUrl::XdgUrl(const QString &xdgUrl, Core::Config *appConfig, Core::Config *userConfig, Core::Network *asyncNetwork, QObject *parent) :
QObject(parent), _xdgUrl(xdgUrl), _appConfig(appConfig), _userConfig(userConfig), _asyncNetwork(asyncNetwork)
{
_meta = _parse();
_destinations = _importDestinations();
_archiveTypes = _importArchiveTypes();
}
QJsonObject XdgUrl::_parse()
{
QUrl url(_xdgUrl);
QUrlQuery query(url);
QJsonObject meta;
meta["scheme"] = QString("xdg");
meta["command"] = QString("download");
meta["url"] = QString("");
meta["type"] = QString("downloads");
meta["filename"] = QString("");
if (!url.scheme().isEmpty()) {
meta["scheme"] = url.scheme();
}
if (!url.host().isEmpty()) {
meta["command"] = url.host();
}
if (query.hasQueryItem("url") && !query.queryItemValue("url").isEmpty()) {
meta["url"] = query.queryItemValue("url", QUrl::FullyDecoded);
}
if (query.hasQueryItem("type") && !query.queryItemValue("type").isEmpty()) {
meta["type"] = query.queryItemValue("type", QUrl::FullyDecoded);
}
if (query.hasQueryItem("filename") && !query.queryItemValue("filename").isEmpty()) {
meta["filename"] = query.queryItemValue("filename", QUrl::FullyDecoded).split("?").at(0);
}
if (!meta["url"].toString().isEmpty() && meta["filename"].toString().isEmpty()) {
meta["filename"] = QUrl(meta["url"].toString()).fileName();
}
return meta;
}
QString XdgUrl::_convertPathString(const QString &path)
{
QString newPath = path;
if (newPath.contains("$HOME")) {
newPath.replace("$HOME", Utility::File::homePath());
}
else if (newPath.contains("$XDG_DATA")) {
newPath.replace("$XDG_DATA", Utility::File::xdgDataHomePath());
}
else if (newPath.contains("$KDE_DATA")) {
newPath.replace("$KDE_DATA", Utility::File::kdeDataHomePath());
}
return newPath;
}
QJsonObject XdgUrl::_importDestinations()
{
QJsonObject destinations;
QJsonObject appConfigDestinations = _appConfig->get("destinations");
QJsonObject appConfigDestinationsAlias = _appConfig->get("destinations_alias");
QJsonObject userConfigDestinations = _userConfig->get("destinations");
QJsonObject userConfigDestinationsAlias = _userConfig->get("destinations_alias");
foreach (const QString key, appConfigDestinations.keys()) {
destinations[key] = _convertPathString(appConfigDestinations[key].toString());
}
foreach (const QString key, appConfigDestinationsAlias.keys()) {
QString value = appConfigDestinationsAlias[key].toString();
if (destinations.contains(value)) {
destinations[key] = destinations.value(value);
}
}
if (!userConfigDestinations.isEmpty()) {
foreach (const QString key, userConfigDestinations.keys()) {
destinations[key] = _convertPathString(userConfigDestinations[key].toString());
}
}
if (!userConfigDestinationsAlias.isEmpty()) {
foreach (const QString key, userConfigDestinationsAlias.keys()) {
QString value = userConfigDestinationsAlias[key].toString();
if (destinations.contains(value)) {
destinations[key] = destinations.value(value);
}
}
}
return destinations;
}
QJsonObject XdgUrl::_importArchiveTypes()
{
QJsonObject archiveTypes;
QJsonObject appConfigArchiveTypes = _appConfig->get("archive_types");
QJsonObject userConfigArchiveTypes = _userConfig->get("archive_types");
archiveTypes = appConfigArchiveTypes;
if (!userConfigArchiveTypes.isEmpty()) {
foreach (const QString key, userConfigArchiveTypes.keys()) {
archiveTypes[key] = userConfigArchiveTypes.value(key);
}
}
return archiveTypes;
}
bool XdgUrl::_installPlasmapkg(const QString &path, const QString &type)
{
QProcess process;
QStringList arguments;
arguments << "-t" << type << "-i" << path;
process.start("plasmapkg2", arguments);
if (process.waitForFinished()) {
return true;
}
return false;
}
bool XdgUrl::_uncompressArchive(const QString &path, const QString &targetDir)
{
QMimeDatabase mimeDb;
QString mimeType = mimeDb.mimeTypeForFile(path).name();
QString archiveType;
QProcess process;
QString program;
QStringList arguments;
if (_archiveTypes.contains(mimeType)) {
archiveType = _archiveTypes[mimeType].toString();
if (archiveType == "tar") {
program = "tar";
arguments << "-xf" << path << "-C" << targetDir;
}
else if (archiveType == "zip") {
program = "unzip";
arguments << "-o" << path << "-d" << targetDir;
}
else if (archiveType == "7z") {
program = "7z";
arguments << "x" << path << "-o" + targetDir; // No space between -o and directory
}
else if (archiveType == "rar") {
program = "unrar";
arguments << "e" << path << targetDir;
}
process.start(program, arguments);
if (process.waitForFinished()) {
process.waitForReadyRead();
return true;
}
}
return false;
}
bool XdgUrl::_download()
{
return true;
}
bool XdgUrl::_install()
{
return true;
}
/**
* Private slots
*/
/**
* Public slots
*/
bool XdgUrl::isValid()
{
bool isValid = true;
if (_meta["scheme"].toString() != "xdg" && _meta["scheme"].toString() != "xdgs") {
isValid = false;
}
if (_meta["command"].toString() != "download" && _meta["command"].toString() != "install") {
isValid = false;
}
if (!QUrl(_meta["url"].toString()).isValid()) {
isValid = false;
}
if (!_destinations.contains(_meta["type"].toString())) {
isValid = false;
}
if (_meta["filename"].toString().isEmpty()) {
isValid = false;
}
return isValid;
}
bool XdgUrl::process()
{
return true;
}
} // namespace Handlers
#ifndef HANDLERS_XDGURL_H
#define HANDLERS_XDGURL_H
#include <QObject>
#include <QJsonObject>
//class QNetworkReply;
namespace Core {
class Config;
class Network;
}
namespace Handlers {
class XdgUrl : public QObject
{
Q_OBJECT
private:
QString _xdgUrl;
Core::Config *_appConfig;
Core::Config *_userConfig;
Core::Network *_asyncNetwork;
QJsonObject _meta;
QJsonObject _destinations;
QJsonObject _archiveTypes;
public:
explicit XdgUrl(const QString &xdgUrl, Core::Config *appConfig, Core::Config *userConfig, Core::Network *asyncNetwork, QObject *parent = 0);
private:
QJsonObject _parse();
QString _convertPathString(const QString &path);
QJsonObject _importDestinations();
QJsonObject _importArchiveTypes();
bool _installPlasmapkg(const QString &path, const QString &type = "plasmoid");
bool _uncompressArchive(const QString &path, const QString &targetDir);
bool _download();
bool _install();
private slots:
public slots:
bool isValid();
bool process();
signals:
void downloaded(const QString &metadata);
void installed(const QString &metadata);
};
} // namespace Handlers
#endif // HANDLERS_XDGURL_H
<RCC>
<qresource prefix="/">
<file>qml/main.qml</file>
</qresource>
</RCC>
import QtQuick 2.0
import QtQuick.Controls 1.1
ApplicationWindow {
Component.onCompleted: {
}
}
#include <QIODevice>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QTextStream>
#include "file.h"
namespace Utility {
File::File(QObject *parent) : QObject(parent)
{}
QString File::rootPath()
{
return QDir::rootPath();
}
QString File::tempPath()
{
return QDir::tempPath();
}
QString File::homePath()
{
return QDir::homePath();
}
/**
* XDG Base Directory Specification
* http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
*/
QString File::xdgDataHomePath()
{
QString path = QString::fromLocal8Bit(qgetenv("XDG_DATA_HOME").constData());
if (path.isEmpty()) {
path = homePath() + "/.local/share";
}
return path;
}
QString File::xdgConfigHomePath()
{
QString path = QString::fromLocal8Bit(qgetenv("XDG_CONFIG_HOME").constData());
if (path.isEmpty()) {
path = homePath() + "/.config";
}
return path;
}
QString File::xdgCacheHomePath()
{
QString path = QString::fromLocal8Bit(qgetenv("XDG_CACHE_HOME").constData());
if (path.isEmpty()) {
path = homePath() + "/.cache";
}
return path;
}
/**
* KDE System Administration/Environment Variables
* https://userbase.kde.org/KDE_System_Administration/Environment_Variables
*/
QString File::kdeDataHomePath()
{
// KDE 4
QString path = QString::fromLocal8Bit(qgetenv("KDEHOME").constData());
if (path.isEmpty()) {
path = homePath() + "/.kde";
}
path += "/share";
return path;
}
QFileInfoList File::readDir(const QString &path)
{
QDir dir(path);
dir.setFilter(QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot);
//dir.setSorting(QDir::DirsFirst | QDir::Name);
return dir.entryInfoList();
}
bool File::makeDir(const QString &path)
{
// This function will create all parent directories
QDir dir(path);
if (!dir.exists() && dir.mkpath(path)) {
return true;
}
return false;
}
QString File::readText(const QString &path)
{
QString data;
QFile file(path);
if (file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
in.setCodec("UTF-8");
data = in.readAll();
file.close();
}
return data;
}
bool File::writeText(const QString &path, const QString &data)
{
QFile file(path);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out.setCodec("UTF-8");
out << data;
file.close();
return true;
}
return false;
}
QByteArray File::readBinary(const QString &path)
{
QByteArray data;
QFile file(path);
if (file.exists() && file.open(QIODevice::ReadOnly)) {
data = file.readAll();
file.close();
}
return data;
}
bool File::writeBinary(const QString &path, const QByteArray &data)
{
QFile file(path);
if (file.open(QIODevice::WriteOnly)) {
file.write(data);
file.close();
return true;
}
return false;
}
bool File::copy(const QString &path, const QString &targetPath)
{
// This function will copy files recursively
QFileInfo fileInfo(path);
if (fileInfo.isFile()) {
QFile file(path);
if (file.copy(targetPath)) {
return true;
}
}
else if (fileInfo.isDir()) {
QDir targetDir(targetPath);
QString targetDirName = targetDir.dirName();
targetDir.cdUp();
if (targetDir.mkdir(targetDirName)) {
QDir dir(path);
dir.setFilter(QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot);
QStringList entries = dir.entryList();
foreach (const QString &entry, entries) {
if (!copy(path + "/" + entry, targetPath + "/" + entry)) {
return false;
}
}
return true;
}
}
return false;
}
bool File::move(const QString &path, const QString &targetPath)
{
QFileInfo fileInfo(path);
if (fileInfo.isFile()) {
QFile file(path);
if (file.rename(targetPath)) {
return true;
}
}
else if (fileInfo.isDir()) {
QDir dir(path);
if (dir.rename(path, targetPath)) {
return true;
}
}
return false;
}
bool File::remove(const QString &path)
{
// This function will remove files recursively
QFileInfo fileInfo(path);
if (fileInfo.isFile()) {
QFile file(path);
if (file.remove()) {
return true;
}
}
else if (fileInfo.isDir()) {
QDir dir(path);
if (dir.removeRecursively()) {
return true;
}
}
return false;
}
} // namespace Utility
#ifndef UTILITY_FILE_H
#define UTILITY_FILE_H
#include <QObject>
class QFileInfo;
typedef QList<QFileInfo> QFileInfoList;
namespace Utility {
class File : public QObject
{
Q_OBJECT
public:
explicit File(QObject *parent = 0);
static QString rootPath();
static QString tempPath();
static QString homePath();
static QString xdgDataHomePath();
static QString xdgConfigHomePath();
static QString xdgCacheHomePath();
static QString kdeDataHomePath();
static QFileInfoList readDir(const QString &path);
static bool makeDir(const QString &path);
static QString readText(const QString &path);
static bool writeText(const QString &path, const QString &data);
static QByteArray readBinary(const QString &path);
static bool writeBinary(const QString &path, const QByteArray &data);
static bool copy(const QString &path, const QString &targetPath);
static bool move(const QString &path, const QString &targetPath);
static bool remove(const QString &path);
};
} // namespace Utility
#endif // UTILITY_FILE_H
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include "json.h"
namespace Utility {
Json::Json(QObject *parent) : QObject(parent)
{}
bool Json::isValid(const QString &json)
{
QJsonParseError jsonError;
QJsonDocument::fromJson(json.toUtf8(), &jsonError);
if (jsonError.error == QJsonParseError::NoError) {
return true;
}
return false;
}
QJsonObject Json::convertStrToObj(const QString &json)
{
QJsonObject jsonObj;
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(json.toUtf8(), &jsonError);
if (jsonError.error == QJsonParseError::NoError && jsonDoc.isObject()) {
jsonObj = jsonDoc.object();
}
return jsonObj;
}
QString Json::convertObjToStr(const QJsonObject &jsonObj)
{
QJsonDocument jsonDoc(jsonObj);
return QString::fromUtf8(jsonDoc.toJson());
}
} // namespace Utility