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 876 deletions
usr/bin/xdgurl
usr/share/applications/xdgurl.desktop
usr/share/icons/hicolor/scalable/apps/xdgurl.svg
#!/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
{
"id": "xdgurl",
"name": "xdgurl",
"version": "2.0.3",
"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"
}
{
"bin": "$HOME/.local/bin",
"downloads": "$HOME/Downloads",
"documents": "$HOME/Documents",
"pictures": "$HOME/Pictures",
"music": "$HOME/Music",
"videos": "$HOME/Videos",
"wallpapers": "$XDG_DATA_HOME/wallpapers",
"fonts": "$HOME/.fonts",
"cursors": "$HOME/.icons",
"icons": "$XDG_DATA_HOME/icons",
"emoticons": "$XDG_DATA_HOME/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_HOME/plasma/plasmoids",
"plasma_look_and_feel": "$XDG_DATA_HOME/plasma/look-and-feel",
"plasma_desktopthemes": "$XDG_DATA_HOME/plasma/desktoptheme",
"kwin_effects": "$XDG_DATA_HOME/kwin/effects",
"kwin_scripts": "$XDG_DATA_HOME/kwin/scripts",
"kwin_tabbox": "$XDG_DATA_HOME/kwin/tabbox",
"aurorae_themes": "$XDG_DATA_HOME/aurorae/themes",
"dekorator_themes": "$XDG_DATA_HOME/deKorator/themes",
"qtcurve": "$XDG_DATA_HOME/QtCurve",
"color_schemes": "$XDG_DATA_HOME/color-schemes",
"gnome_shell_extensions": "$XDG_DATA_HOME/gnome-shell/extensions",
"cinnamon_applets": "$XDG_DATA_HOME/cinnamon/applets",
"cinnamon_desklets": "$XDG_DATA_HOME/cinnamon/desklets",
"cinnamon_extensions": "$XDG_DATA_HOME/cinnamon/extensions",
"nautilus_scripts": "$XDG_DATA_HOME/nautilus/scripts",
"amarok_scripts": "$KDEHOME/share/apps/amarok/scripts",
"yakuake_skins": "$KDEHOME/share/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 <QtGlobal>
#include <QString>
#include <QStringList>
#include <QUrl>
#include <QJsonObject>
#include <QCommandLineParser>
//#include <QCoreApplication>
#include <QGuiApplication>
#include <QIcon>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "qtlib_config.h"
#include "handlers/xdgurlhandler.h"
int main(int argc, char *argv[])
{
// Init
//#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
// QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
//#endif
QGuiApplication app(argc, argv);
qtlib::Config config(":/configs");
QJsonObject configApplication = config.get("application");
app.setApplicationName(configApplication["name"].toString());
app.setApplicationVersion(configApplication["version"].toString());
app.setOrganizationName(configApplication["organization"].toString());
app.setOrganizationDomain(configApplication["domain"].toString());
app.setWindowIcon(QIcon::fromTheme(configApplication["id"].toString(), QIcon(configApplication["icon"].toString())));
// Setup CLI
QCommandLineParser clParser;
clParser.setApplicationDescription(configApplication["description"].toString());
clParser.addHelpOption();
clParser.addVersionOption();
clParser.addPositionalArgument("xdgurl", "XDG-URL");
clParser.process(app);
QStringList args = clParser.positionalArguments();
if (args.size() != 1) {
clParser.showHelp(1);
}
QString xdgUrl = args.at(0);
// Setup QML
QQmlApplicationEngine qmlAppEngine;
QQmlContext *qmlContext = qmlAppEngine.rootContext();
qmlContext->setContextProperty("xdgUrlHandler", new XdgUrlHandler(xdgUrl, config, &qmlAppEngine));
qmlAppEngine.load(QUrl("qrc:/qml/main.qml"));
return app.exec();
}
import QtQuick 2.3
import QtQuick.Window 2.0
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.2
import "scripts/Utility.js" as Utility
Window {
id: app
title: Qt.application.name
width: 400
height: 200
minimumWidth: 400
minimumHeight: 200
maximumWidth: 800
maximumHeight: 400
MessageDialog {
id: confirmDialog
title: app.title
icon: StandardIcon.Question
text: ""
informativeText: ""
detailedText: ""
standardButtons: StandardButton.Ok | StandardButton.Cancel
onAccepted: xdgUrlHandler.process()
onRejected: Qt.quit()
}
MessageDialog {
id: infoDialog
title: app.title
icon: StandardIcon.Information
text: ""
informativeText: ""
detailedText: ""
standardButtons: StandardButton.Open | StandardButton.Close
onAccepted: {
xdgUrlHandler.openDestination();
Qt.quit();
}
onRejected: Qt.quit()
}
MessageDialog {
id: errorDialog
title: app.title
icon: StandardIcon.Warning
text: ""
informativeText: ""
detailedText: ""
standardButtons: StandardButton.Close
onRejected: Qt.quit()
}
Dialog {
id: progressDialog
title: app.title
property alias primaryLabel: primaryLabel
property alias informativeLabel: informativeLabel
property alias progressBar: progressBar
property alias progressLabel: progressLabel
contentItem: Item {
implicitWidth: 400
implicitHeight: 150
Column {
anchors.fill: parent
anchors.margins: 12
spacing: 8
Label {
id: primaryLabel
text: " "
font.bold: true
}
Label {
id: informativeLabel
text: " "
}
ProgressBar {
id: progressBar
maximumValue: 1
minimumValue: 0
value: 0
anchors.left: parent.left
anchors.right: parent.right
}
Label {
id: progressLabel
text: " "
anchors.right: parent.right
}
Button {
id: cancelButton
text: qsTr("Cancel")
anchors.right: parent.right
onClicked: Qt.quit()
}
}
}
}
Component.onCompleted: {
var metadata = xdgUrlHandler.metadata();
var primaryMessages = {
"success_download": qsTr("Download successfull"),
"success_install": qsTr("Installation successfull"),
"error_validation": qsTr("Validation error"),
"error_network": qsTr("Network error"),
"error_save": qsTr("Saving file failed"),
"error_install": qsTr("Installation failed")
};
xdgUrlHandler.started.connect(function() {
progressDialog.open();
});
xdgUrlHandler.finishedWithSuccess.connect(function(result) {
progressDialog.close();
infoDialog.text = primaryMessages[result.status];
infoDialog.informativeText = metadata.filename;
infoDialog.detailedText = result.message;
infoDialog.open();
});
xdgUrlHandler.finishedWithError.connect(function(result) {
progressDialog.close();
errorDialog.text = primaryMessages[result.status];
errorDialog.informativeText = metadata.filename;
errorDialog.detailedText = result.message;
errorDialog.open();
});
xdgUrlHandler.downloadProgress.connect(function(id, bytesReceived, bytesTotal) {
progressDialog.primaryLabel.text = qsTr("Downloading");
progressDialog.informativeLabel.text = metadata.filename;
progressDialog.progressBar.value = bytesReceived / bytesTotal;
progressDialog.progressLabel.text = Utility.convertByteToHumanReadable(bytesReceived)
+ " / " + Utility.convertByteToHumanReadable(bytesTotal)
});
if (xdgUrlHandler.isValid()) {
if (metadata.command === "download") {
confirmDialog.text = qsTr("Do you want to download?");
}
else if (metadata.command === "install") {
confirmDialog.text = qsTr("Do you want to install?");
}
confirmDialog.informativeText = metadata.filename;
confirmDialog.detailedText = qsTr("URL") + ": " + metadata.url + "\n\n"
+ qsTr("File") + ": " + metadata.filename + "\n\n"
+ qsTr("Type") + ": " + metadata.type;
confirmDialog.open();
}
else {
errorDialog.text = qsTr("Validation error");
errorDialog.detailedText = qsTr("Invalid XDG-URL") + " " + xdgUrlHandler.xdgUrl();
errorDialog.open();
}
}
}
<?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>
*.pro.user
# qtlib
A library for Qt app.
Copyright: Akira Ohgaki
License: LGPL-3+
include(qtlib.pri)
TARGET = qtlib-test
TEMPLATE = app
CONFIG += c++11
QT += core
SOURCES += test/main.cpp
DISTFILES += README.md
QT += \
core \
network
HEADERS += \
$${PWD}/src/qtlib_file.h \
$${PWD}/src/qtlib_dir.h \
$${PWD}/src/qtlib_json.h \
$${PWD}/src/qtlib_config.h \
$${PWD}/src/qtlib_networkresource.h \
$${PWD}/src/qtlib_ocsapi.h \
$${PWD}/src/qtlib_package.h
SOURCES += \
$${PWD}/src/qtlib_file.cpp \
$${PWD}/src/qtlib_dir.cpp \
$${PWD}/src/qtlib_json.cpp \
$${PWD}/src/qtlib_config.cpp \
$${PWD}/src/qtlib_networkresource.cpp \
$${PWD}/src/qtlib_ocsapi.cpp \
$${PWD}/src/qtlib_package.cpp
INCLUDEPATH += $${PWD}/src
unix:!ios:!android {
DEFINES += QTLIB_UNIX
}
android {
QT += androidextras
}
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_config.h"
#include "qtlib_file.h"
#include "qtlib_dir.h"
#include "qtlib_json.h"
namespace qtlib {
Config::Config(const QString &configDirPath, QObject *parent)
: QObject(parent), configDirPath_(configDirPath)
{}
Config::Config(const Config &other, QObject *parent)
: QObject(parent)
{
setConfigDirPath(other.configDirPath());
}
Config &Config::operator =(const Config &other)
{
setConfigDirPath(other.configDirPath());
return *this;
}
QString Config::configDirPath() const
{
return configDirPath_;
}
void Config::setConfigDirPath(const QString &configDirPath)
{
configDirPath_ = configDirPath;
}
QJsonObject Config::get(const QString &name)
{
QString configFilePath = configDirPath() + "/" + name + ".json";
QByteArray json = qtlib::File(configFilePath).readData();
if (json.isEmpty()) {
json = QString("{}").toUtf8(); // Blank JSON data as default
}
return qtlib::Json(json).toObject();
}
bool Config::set(const QString &name, const QJsonObject &object)
{
QString configFilePath = configDirPath() + "/" + name + ".json";
QByteArray json = qtlib::Json(object).toJson();
qtlib::Dir(configDirPath()).make();
return qtlib::File(configFilePath).writeData(json);
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
#include <QJsonObject>
namespace qtlib {
class Config : public QObject
{
Q_OBJECT
public:
explicit Config(const QString &configDirPath = "", QObject *parent = 0);
Config(const Config &other, QObject *parent = 0);
Config &operator =(const Config &other);
QString configDirPath() const;
void setConfigDirPath(const QString &configDirPath);
QJsonObject get(const QString &name);
bool set(const QString &name, const QJsonObject &object);
private:
QString configDirPath_;
};
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_dir.h"
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QStandardPaths>
namespace qtlib {
Dir::Dir(const QString &path, QObject *parent)
: QObject(parent), path_(path)
{}
Dir::Dir(const Dir &other, QObject *parent)
: QObject(parent)
{
setPath(other.path());
}
Dir &Dir::operator =(const Dir &other)
{
setPath(other.path());
return *this;
}
QString Dir::path() const
{
return path_;
}
void Dir::setPath(const QString &path)
{
path_ = path;
}
bool Dir::exists()
{
return QDir(path()).exists();
}
QFileInfoList Dir::list()
{
QDir dir(path());
dir.setFilter(QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot);
//dir.setSorting(QDir::DirsFirst | QDir::Name);
return dir.entryInfoList();
}
bool Dir::make()
{
// This function will create all parent directories
QDir dir(path());
if (!dir.exists() && dir.mkpath(path())) {
return true;
}
return false;
}
bool Dir::copy(const QString &newPath)
{
// This function will copy files recursively
return copyRecursively(path(), newPath);
}
bool Dir::move(const QString &newPath)
{
return QDir(path()).rename(path(), newPath);
}
bool Dir::remove()
{
// This function will remove files recursively
return QDir(path()).removeRecursively();
}
QString Dir::rootPath()
{
return QDir::rootPath();
}
QString Dir::tempPath()
{
return QDir::tempPath();
}
QString Dir::homePath()
{
return QDir::homePath();
}
QString Dir::genericDataPath()
{
return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
}
QString Dir::genericConfigPath()
{
return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
}
QString Dir::genericCachePath()
{
return QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation);
}
QString Dir::kdehomePath()
{
// KDE System Administration/Environment Variables
// https://userbase.kde.org/KDE_System_Administration/Environment_Variables
// KDE 4 maybe uses $KDEHOME
QString kdehomePath = QString::fromLocal8Bit(qgetenv("KDEHOME").constData());
if (kdehomePath.isEmpty()) {
kdehomePath = homePath() + "/.kde";
}
return kdehomePath;
}
bool Dir::copyRecursively(const QString &srcPath, const QString &newPath)
{
QFileInfo fileInfo(srcPath);
if (fileInfo.isSymLink() && !fileInfo.exists()) {
// Ignore broken symlink
return true;
}
else if (fileInfo.isFile()) {
return QFile(srcPath).copy(newPath);
}
else if (fileInfo.isDir()) {
QDir newDir(newPath);
QString newDirName = newDir.dirName();
newDir.cdUp();
if (newDir.mkdir(newDirName)) {
QDir dir(srcPath);
dir.setFilter(QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot);
QStringList entries = dir.entryList();
foreach (const QString &entry, entries) {
if (!copyRecursively(srcPath + "/" + entry, newPath + "/" + entry)) {
return false;
}
}
return true;
}
}
return false;
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
#include <QFileInfoList>
namespace qtlib {
class Dir : public QObject
{
Q_OBJECT
public:
explicit Dir(const QString &path = "", QObject *parent = 0);
Dir(const Dir &other, QObject *parent = 0);
Dir &operator =(const Dir &other);
QString path() const;
void setPath(const QString &path);
bool exists();
QFileInfoList list();
bool make();
bool copy(const QString &newPath);
bool move(const QString &newPath);
bool remove();
static QString rootPath();
static QString tempPath();
static QString homePath();
static QString genericDataPath();
static QString genericConfigPath();
static QString genericCachePath();
static QString kdehomePath();
private:
bool copyRecursively(const QString &srcPath, const QString &newPath);
QString path_;
};
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#include "qtlib_file.h"
#include <QIODevice>
#include <QTextStream>
#include <QFile>
namespace qtlib {
File::File(const QString &path, QObject *parent)
: QObject(parent), path_(path)
{}
File::File(const File &other, QObject *parent)
: QObject(parent)
{
setPath(other.path());
}
File &File::operator =(const File &other)
{
setPath(other.path());
return *this;
}
QString File::path() const
{
return path_;
}
void File::setPath(const QString &path)
{
path_ = path;
}
bool File::exists()
{
return QFile(path()).exists();
}
QByteArray File::readData()
{
QByteArray data;
QFile file(path());
if (file.exists() && file.open(QIODevice::ReadOnly)) {
data = file.readAll();
file.close();
}
return data;
}
bool File::writeData(const QByteArray &data)
{
QFile file(path());
if (file.open(QIODevice::WriteOnly)) {
file.write(data);
file.close();
return true;
}
return false;
}
QString File::readText()
{
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 &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;
}
bool File::copy(const QString &newPath)
{
return QFile(path()).copy(newPath);
}
bool File::move(const QString &newPath)
{
return QFile(path()).rename(newPath);
}
bool File::remove()
{
return QFile(path()).remove();
}
} // namespace qtlib
/**
* qtlib
*
* @author Akira Ohgaki <akiraohgaki@gmail.com>
* @copyright Akira Ohgaki
* @license https://opensource.org/licenses/LGPL-3.0
* @link https://github.com/akiraohgaki/qtlib
*/
#pragma once
#include <QObject>
namespace qtlib {
class File : public QObject
{
Q_OBJECT
public:
explicit File(const QString &path = "", QObject *parent = 0);
File(const File &other, QObject *parent = 0);
File &operator =(const File &other);
QString path() const;
void setPath(const QString &path);
bool exists();
QByteArray readData();
bool writeData(const QByteArray &data);
QString readText();
bool writeText(const QString &data);
bool copy(const QString &newPath);
bool move(const QString &newPath);
bool remove();
private:
QString path_;
};
} // namespace qtlib